Node.js не может обработать мой клиентский код, который выполняет что-то похожее на шаблон jQuery/Zepto XHR ниже:
$.ajax({
type: 'POST',
url: '/someUrl',
success: function(response) {
$.ajax({ // ... do another XHR
Я делал этот шаблон (инициируя запрос XHR в другом запросе XHR) раньше в других фреймворках. Я читал об ошибке Node.js: Can' t устанавливать заголовки после их отправки и как работает основанная на событиях модель сервера Node.js. Другими словами, первый запрос XHR не вызвал res.end(), поэтому, когда вызывается второй запрос XHR, Node.js жалуется (кстати, в непрерывном цикле).
Мои вопросы: кто-нибудь может порекомендовать альтернативный шаблон для цепочки запросов XHR на стороне клиента? Есть ли что-то, что я могу сделать на стороне сервера Node.js, чтобы сохранить существующий шаблон на стороне клиента?
Обновление на основе принятого ответа
Ошибка, безусловно, в моем собственном коде на стороне сервера. Простая функция проверки выдавала ошибку, но после ее обнаружения вызывалась только функция res.end(). По какой-то причине я предполагал, что вызов res.end() немедленно остановит выполнение функции. В этом случае вставка «возврата» останавливает выполнение сразу после отправки сообщения JSON клиенту.
if (_.isEmpty(req.body)) {
res.end(JSON.stringify({'Error':'POST required'}));
// suppose 'return' is needed here as well
return
} else {
try {
if (_.has(req.body, 'id')) {
id = parseInt(req.body['id']);
} else {
throw {'Error':'Missing param in req.body'};
} // end if
} catch(err) {
res.end(JSON.stringify({'Error':'Missing key(s)','Keys':_.keys(req.body)}));
// without a return here, the code below this 'do some more work' would
// be executed
return
} // end else
// do some more work
// without the above 'return''s the code would
// a) make a database call
// b) call res.end() again!!! <-- bad.
success
вызывается после того, как все данные были переданы сервером, поэтому объект Noderesponse
должен был быть уже закрыт, чтобы достичь этой точки, и второй вызов AJAX не должен иметь влияния. - person   schedule 17.02.2012