Почему я могу выполнить код после "res. send"?


мне интересно, какова механика поведения следующего кода:

res.send(200, { data: 'test data' });
console.log('still here...');

мое понимание заключается в том, что res.send не возвращение функции, но делает закрыть соединение / завершить запрос. Это может объяснить, почему я все еще могу выполнить код после res.send команда (я просмотрел источник express, и это не похоже на асинхронную функцию).

есть ли что-то еще в игре, что я могу быть не хватает?

2 53

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');
}

точный возвращение на