Kiedy używać next () i zwracać next () w Node.js

Scenariusz : rozważ, że Poniżej znajduje się część kodu z aplikacji sieciowej węzła.

app.get('/users/:id?', function(req, res, next){
    var id = req.params.id;
    if (id) {
        // do something
    } else {
        next(); //or return next();
    }
});

Problem : sprawdzam, który wybrać właśnie next() lub return next(). Powyższy przykładowy kod działa dokładnie tak samo dla obu i nie wykazuje żadnej różnicy w wykonaniu.

Pytanie : czy ktoś może to rozjaśnić, kiedy używać next() i kiedy używać return next() i jakąś ważną różnicę?

Author: Amol M Kulkarni, 2013-05-29

3 answers

Niektórzy ludzie zawsze piszą return next(), aby upewnić się, że wykonanie zatrzyma się po wywołaniu wywołania zwrotnego.

Jeśli tego nie zrobisz, ryzykujesz ponowne wywołanie zwrotne po raz drugi, co zwykle przynosi druzgocące rezultaty. Twój kod jest w porządku, ale przepisałbym go jako:

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

    if(!id)
        return next();

    // do something
});

Zapisuje mi poziom wcięcia, a kiedy przeczytam kod ponownie później, jestem pewien, że nie ma możliwości, aby next został wywołany dwa razy.

 87
Author: Laurent Perrin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-30 13:01:50

Jako odpowiedź @ Laurent Perrin:

Jeśli tego nie zrobisz, ryzykujesz ponowne wywołanie zwrotne po raz drugi, co zwykle przynosi niszczycielskie rezultaty

Podam tutaj przykład, jeśli napiszesz middleware w ten sposób:

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()
})

Dowiesz się, że wyjście w konsoli to:

This is a middleware
This is second middleware
This is third middleware
This is first-half middleware

To znaczy, że uruchamia poniższy kod next() po zakończeniu wszystkich funkcji middleware.

Jednak, jeśli użyjesz return next(), natychmiast wyskoczy callback i Kod poniżej return next() w wywołaniu zwrotnym będzie nieosiągalne.

 70
Author: PJCHENder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-14 02:01:22

next() jest częścią connect middleware. Wywołania zwrotne dla routera nie dbają o to, czy zwracasz coś z funkcji, więc return next() i next(); return; są zasadniczo takie same.

W przypadku, gdy chcesz zatrzymać przepływ funkcji, możesz użyć next(err) Jak poniżej

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'); 
    }
);

Prawie next() jest używany do rozszerzania oprogramowania pośredniczącego twoich żądań.

 42
Author: drinchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-01 10:07:14