2013-04-23 2 views
47

мне интересно, что механики за поведением следующего кода являются:Почему я могу выполнить код после «res.send»?

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

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

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

+0

Извините, я неправильно прочитал ваше сообщение и не был уверен, что проблема с вашим кодом, так как это совершенно законно. когда вы вызываете 'send', он просто передает данные из http-соединения и ваш код продолжается. вы можете просто использовать 'return', если хотите завершить код, или просто не писать ничего. извините за неправильное толкование. – Timmerz

ответ

76

Уверенный 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, для которых требуется, чтобы действительный ответ был открытым).

+0

Ах, хорошо, поэтому причина, по которой мы можем продолжить код после отправки запроса, заключается в том, что в узле не существует нити для остановки? Итак, браузер, ответ отправлен, соединение закрыто, но это не значит, что скрипт вышел.Я использовал это поведение раньше, но просто не был уверен в том, что за ним стоит ПОЧЕМУ. – Leonidas

+0

Любые идеи о том, как вернуть функцию после отправки? – OscarVGG

+4

@OscarVGG: 'return'? – josh3736

32

Редактировать: Я больше не буду объяснять, что объясняется ниже, так как вы не должны возвращать значение, когда в этом нет необходимости. Это делает ваш код менее читаемым и выглядит взломанным. Вместо этого я предлагаю отделить оператор return от res.send(). @slavafomin объяснил это хорошо в комментариях.

Простой способ остановить выполнение функции и отправить ответ в то же самое время, делая

return res.send('500', 'Error message here'); 

Это позволяет использовать короткие if заявления для обработки ошибок, таких как:

if (err) { 
    return res.send('500', 'Error message here'); 
} 

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

+2

Это отличная точка, но не технически ответ. потому что вопрос скорее о том, почему, чем о том, как. Тем не менее, большой вклад, следовательно, повышается :). – Nepoxx

+3

Да, в то время я не мог комментировать, поэтому мне пришлось отправить ответ. – marcospgp

+1

Я бы порекомендовал использовать эту технику. Это делает код короче, но также делает его менее значимым и неопределенным, потому что он использует неправильную семантику. Если вы не используете значение из функции, вы не должны ее возвращать. Также он может сломать типизированный JavaScript (например, TypeScript) и инструменты, используя статический анализ кода. Другими словами: это выглядит хакерским и непрофессиональным. –

Смежные вопросы