Когда использовать next() и return next() в Node.js
Сценарий. Рассмотрим следующую часть кода из веб-приложения узла.
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next(); //or return next();
}
});
Проблема: я проверяю, какой из них использовать просто next()
или return next()
. Приведенный выше пример кода работает одинаково для обоих и не показал никакой разницы в исполнении.
Вопрос: Может ли кто-то осветить это, когда использовать next()
и когда использовать return next()
и какая-то важная разница?
Ответы
Ответ 1
Некоторые люди всегда пишут return next()
, чтобы гарантировать, что выполнение прекратится после запуска обратного вызова.
Если вы этого не сделаете, вы рискуете вызвать обратный вызов второй раз позже, что, как правило, приводит к разрушительным результатам. Ваш код в порядке, но я бы переписал его как:
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if(!id)
return next();
// do something
});
Сохраняет мне уровень отступов, и когда я снова прочитаю код позже, я уверен, что нет способа next
вызываться дважды.
Ответ 2
Как @Laurent Perrin ответ:
Если вы этого не сделаете, вы рискуете вызвать обратный вызов второй раз позже, что обычно имеет разрушительные результаты
Приведем здесь пример, если вы пишете промежуточное ПО следующим образом:
app.use((req, res, next) => {
console.log('This is a middleware')
next()
console.log('This is first-half middleware')
})
app.use((req, res, next) => {
console.log('This is second middleware')
next()
})
app.use((req, res, next) => {
console.log('This is third middleware')
next()
})
Вы узнаете, что вывод на консоли:
This is a middleware
This is second middleware
This is third middleware
This is first-half middleware
То есть, он запускает следующий код() после завершения всех функций промежуточного программного обеспечения.
Однако, если вы используете return next()
, он немедленно выкинет обратный вызов, а код ниже return next()
в обратном вызове будет недоступен.
Ответ 3
next()
является частью подключить промежуточное программное обеспечение. Обратные вызовы для потока маршрутизатора не волнует, что вы возвращаете что-либо из своих функций, поэтому return next()
и next(); return;
в основном одинаковы.
Если вы хотите остановить поток функций, вы можете использовать next(err)
следующим образом
app.get('/user/:id?',
function(req, res, next) {
console.log('function one');
if ( !req.params.id )
next('No ID'); // This will return error
else
next(); // This will continue to function 2
},
function(req, res) {
console.log('function two');
}
);
В значительной степени next()
используется для расширения промежуточного программного обеспечения ваших запросов.
Ответ 4
Следующий():
Вызов этой функции вызывает следующую функцию промежуточного программного обеспечения в приложении. Функция next() не является частью Node.js или Express API, но является третьим аргументом, который передается в функцию промежуточного программного обеспечения.