Когда использовать 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, но является третьим аргументом, который передается в функцию промежуточного программного обеспечения.