Подтвердить что ты не робот

Последствия не вызова 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(); остается вне кода, он, кажется, не вызывает ошибок и работает из того, что я вижу.

4b9b3361

Ответ 1

В обновить Руководство по API есть следующее:

Вы отвечаете за вызов next(), чтобы запустить следующий обработчик в цепочке.

"Цепочка", на которую они ссылаются, - это цепочка обработчиков для каждого маршрута. В общем, каждый маршрут будет обрабатываться несколькими обработчиками в определенном порядке. Последнему обработчику в цепочке действительно не нужно вызывать next() - но небезопасно предположить, что обработчик всегда будет последним. Невозможность вызвать всех обработчиков в цепочке может привести к серьезным или тонким ошибкам при обработке запросов.

Поэтому, как хорошая практика программирования, ваши обработчики всегда должны вызывать next() [с соответствующими аргументами].

Ответ 2

Другая проблема (в настоящее время) заключается в том, что событие Server after не выдается, если все обработчики не вызывают next. Например, если вы используете auditLogger для регистрации запросов с использованием события after, вы не будете получать журналы для любых запросов, которые попадают в обработчик, который не вызывает следующий.

Я открыл PR, чтобы исправить проблему, чтобы событие after излучалось в любом случае, но вызов next - это ожидаемая норма для приложений, использующих restify.