Последствия не вызова next() в рефаймите
Я использую Restify в течение некоторого времени. Я столкнулся с некоторым кодом, которому не хватает next()
, и мне пришло в голову, что я не уверен, полностью ли понимаю причину, по которой next()
следует вызывать после res.send()
. Я понимаю, зачем использовать его в ситуации промежуточного программного обеспечения, но для обычного маршрута, зачем он нужен? Например:
server.get('/a/:something/',function(req,res,next) {
res.send('ok');
});
против
server.get('/b/:something/',function(req,res,next) {
res.send('ok');
return next();
});
Если return next();
остается вне кода, он, кажется, не вызывает ошибок и работает из того, что я вижу.
Ответы
Ответ 1
В обновить Руководство по API есть следующее:
Вы отвечаете за вызов next(), чтобы запустить следующий обработчик в цепочке.
"Цепочка", на которую они ссылаются, - это цепочка обработчиков для каждого маршрута. В общем, каждый маршрут будет обрабатываться несколькими обработчиками в определенном порядке. Последнему обработчику в цепочке действительно не нужно вызывать next() - но небезопасно предположить, что обработчик всегда будет последним. Невозможность вызвать всех обработчиков в цепочке может привести к серьезным или тонким ошибкам при обработке запросов.
Поэтому, как хорошая практика программирования, ваши обработчики всегда должны вызывать next() [с соответствующими аргументами].
Ответ 2
Другая проблема (в настоящее время) заключается в том, что событие Server after
не выдается, если все обработчики не вызывают next
. Например, если вы используете auditLogger для регистрации запросов с использованием события after
, вы не будете получать журналы для любых запросов, которые попадают в обработчик, который не вызывает следующий.
Я открыл PR, чтобы исправить проблему, чтобы событие after
излучалось в любом случае, но вызов next
- это ожидаемая норма для приложений, использующих restify.