Когда использовать next() и возвращать next () в узле.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() и какая-то важная разница?

3 84

3 ответа:

некоторые люди всегда пишу return next() обеспечить выполнение останавливается после запуска обратного вызова.

Если вы этого не сделаете, вы рискуете вызвать обратный вызов во второй раз позже, что обычно приводит к разрушительным результатам. Ваш код в порядке, но я бы переписал его как:

app.get('/users/:id?', function(req, res, next){
    var id = req.params.id;

    if(!id)
        return next();

    // do something
});

это экономит мне уровень отступа, и когда я читаю код снова позже, я уверен, что нет никакого способа next вызывается дважды.

как ответ @ 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

то есть, он запускает код ниже next() после завершения всех функций промежуточного программного обеспечения.

однако, если вы используете return next(), это выскочит обратный вызов сразу и код ниже return next() вызов будет недоступен.

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() используется для расширения промежуточного программного обеспечения ваших запросов.