Node.js Не удается установить заголовки после их отправки. При инициировании запроса XHR в другом запросе XHR - PullRequest
0 голосов
/ 17 февраля 2012

Node.js не может обработать мой клиентский код, который выполняет что-то похожее на шаблон XHR jQuery / Zepto:

$.ajax({
  type: 'POST',
  url: '/someUrl',
  success: function(response) {
     $.ajax({  // ... do another XHR

Я сделал это (инициировал шаблон XHR в другом запросе XHR)раньше в других рамках.Я прочитал о Node.js Ошибка: не удается установить заголовки после того, как они отправлены и как работает основанная на событиях модель сервера Node.js.Другими словами, первый запрос XHR не вызвал res.end (), поэтому, когда второй запрос XHR называется Node.js, жалуется (в непрерывном цикле между прочим).

Мои вопросы: сможет ли кто-нибудь порекомендовать альтернативный шаблон для цепочки запросов XHR на стороне клиента?Могу ли я что-нибудь сделать на стороне сервера Node.js, чтобы сохранить существующий шаблон на стороне клиента?

Обновление на основе принятого ответа Ошибка, конечно, в моем собственном коде на стороне сервера.Простая функция проверки выдает ошибку, но при ее обнаружении вызывается только res.end ().По какой-то причине предположение, которое я вызывал res.end (), немедленно остановило бы выполнение функции.В этом случае вставка 'return' останавливает выполнение сразу после отправки клиенту сообщения 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. 

1 Ответ

0 голосов
/ 18 февраля 2012

Проблема не в том, что вы думаете.Ваши два XHR происходят последовательно, а не параллельно из-за обратных вызовов.Обратный вызов success первого не сработает, пока весь запрос / ответ не будет завершен для первого запроса (node.js уже вызвал response.end (), а браузер получил и проанализировал ответ).Только тогда начинается второй XHR.У вас хорошо работает шаблон AJAX на стороне клиента.Он будет одинаково хорошо работать с node.js и любым другим веб-сервером.

Ваша проблема в коде вашего узла server.js на стороне сервера, но это не ошибка или ограничение узла, это ошибка программирования с вашей стороны,Опубликуйте свой код на стороне сервера, и мы поможем вам его отследить.Новички в node.js очень часто сталкиваются с этой ошибкой простым ошибочным кодированием.

...