Почему я могу выполнить код после "res. send"?
мне интересно, какова механика поведения следующего кода:
res.send(200, { data: 'test data' });
console.log('still here...');
мое понимание заключается в том, что res.send
не возвращение функции, но делает закрыть соединение / завершить запрос. Это может объяснить, почему я все еще могу выполнить код после res.send
команда (я просмотрел источник express, и это не похоже на асинхронную функцию).
есть ли что-то еще в игре, что я могу быть не хватает?
2 ответа:
обязательно
end
завершает HTTP-ответ, но он не делает ничего особенного для вашего кода.вы можете продолжать делать другие вещи, даже после того, как вы закончили ответ.
что ты не могу сделать, однако, это сделать что-нибудь полезное с
res
. Поскольку ответ вы не можете написать больше данных.res.send(...); res.write('more stuff'); // throws an error since res is now closed
это поведение отличается от других традиционных фреймворков (PHP, ASP и т. д.), которые выделяют поток для HTTP-запроса и завершить поток, когда реакция закончится. Если вы вызываете эквивалентную функцию, такую как ASP
Response.End
поток завершается, и ваш код не будет выполняться. В узле нет потока для остановки.req
иres
больше не будет запускать события, но код в ваших обратных вызовах может продолжать работать (пока он не пытается вызвать методы наres
которые требуют, чтобы действительный ответ был открыт).
Edit: Я больше не делаю то, что описано ниже, так как вы не должны возвращать значение, когда в этом нет необходимости. Это делает ваш код менее читаемым и выглядит программистские. Вместо этого я предлагаю отделить оператор return от
res.send()
. @slavafomin хорошо объяснил это в комментариях.простой способ остановить выполнение функции и отправить ответ в то же время, делая
return res.send('500', 'Error message here');
Это позволяет использовать короткие
if
заявления для обработки таких ошибок, как:if (err) { return res.send('500', 'Error message here'); }
точный возвращение на