Node.js не может обработать мой клиентский код, который выполняет что-то похожее на JQuery/Zepto шаблон XHR ниже:Node.js Невозможно установить заголовки после их отправки. При инициации запроса XHR внутри другого запроса XHR
$.ajax({
type: 'POST',
url: '/someUrl',
success: function(response) {
$.ajax({ // ... do another XHR
Я сделал это (инициирование запроса XHR в рамках другого запроса XHR), шаблон в других рамках. Я читал о Node.js Error: Can't set headers after they are sent и о том, как работает модель сервера Node.js на основе событий. Другими словами, первый запрос XHR не вызвал res.end(), поэтому, когда второй запрос XHR называется Node.js, возникает жалоба (в непрерывном цикле btw).
Мои вопросы: может ли кто-нибудь рекомендовать альтернативный шаблон для привязки 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.
Думая об этом еще немного, альтернативный шаблон (и, по общему признанию, более эффективный), если второй запрос XHR принадлежит САМОМУ серверу, тогда расточительно открывать второе соединение, поскольку он уже открыт. Поэтому вместо того, чтобы думать о том, чтобы сделать много отдельных вызовов для backend api (скажем, для getUsers и другого для getProfiles), может быть лучше консолидировать разрозненные данные в один запрос XHR (например, getPage? Modules = getUsers, getProfiles). Мысли? – exshovelrydr
Чтобы быть совершенно честным, я думаю, нам нужно увидеть код конца в Node.js, чтобы узнать, что происходит, @exshovelrydr. Образец, который вы описываете, безусловно, должен * работать в Node.js, если я его правильно читаю - обратный вызов '' success'' вызывается, как только все данные были переданы сервером, поэтому ответ узла '' объект должен быть уже закрыт для достижения этой точки, а второй вызов AJAX не должен иметь никакого влияния. –