2012-02-17 1 views
0

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. 
+0

Думая об этом еще немного, альтернативный шаблон (и, по общему признанию, более эффективный), если второй запрос XHR принадлежит САМОМУ серверу, тогда расточительно открывать второе соединение, поскольку он уже открыт. Поэтому вместо того, чтобы думать о том, чтобы сделать много отдельных вызовов для backend api (скажем, для getUsers и другого для getProfiles), может быть лучше консолидировать разрозненные данные в один запрос XHR (например, getPage? Modules = getUsers, getProfiles). Мысли? – exshovelrydr

+1

Чтобы быть совершенно честным, я думаю, нам нужно увидеть код конца в Node.js, чтобы узнать, что происходит, @exshovelrydr. Образец, который вы описываете, безусловно, должен * работать в Node.js, если я его правильно читаю - обратный вызов '' success'' вызывается, как только все данные были переданы сервером, поэтому ответ узла '' объект должен быть уже закрыт для достижения этой точки, а второй вызов AJAX не должен иметь никакого влияния. –

ответ

0

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

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

+0

Благодарим вас за объяснение. Я сделал простой тест, который приковал XHR-запросы к серверу Node.js, и он работал, как ожидалось. Я собираюсь отладить мой код и посмотреть, могу ли я найти ошибку. – exshovelrydr