web-dev-qa-db-fra.com

Quand utiliser next () et renvoyer next () dans Node.js

Scénario: Considérez ce qui suit est la partie de code provenant d'une application Web de noeud.

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

Issue: Je vérifie lequel utiliser avec seulement next() ou return next(). L'exemple de code ci-dessus fonctionne exactement de la même manière et ne montre aucune différence d'exécution.

Question: Quelqu'un peut-il éclaircir ceci, quand utiliser next() et quand utiliser return next() et une différence importante?

107
Amol M Kulkarni

Certaines personnes écrivent toujours return next() est de s'assurer que l'exécution s'arrête après le déclenchement du rappel.

Si vous ne le faites pas, vous risquez de déclencher le rappel une deuxième fois plus tard, ce qui a généralement des résultats dévastateurs. Votre code est correct tel quel, mais je le récrirais comme suit:

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

    if(!id)
        return next();

    // do something
});

Cela me fait économiser un niveau d'indentation, et quand je relirai le code plus tard, je suis sûr qu'il n'y a aucun moyen d'appeler next deux fois.

114
Laurent Perrin

Comme la réponse de @Laurent Perrin:

Si vous ne le faites pas, vous risquez de déclencher le rappel une deuxième fois plus tard, ce qui a généralement des résultats dévastateurs.

Je donne un exemple ici si vous écrivez un middleware comme ceci:

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

Vous découvrirez que la sortie dans la console est:

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

C'est-à-dire qu'il exécute le code ci-dessous next () une fois que toutes les fonctions du middleware sont terminées.

Toutefois, si vous utilisez return next(), le rappel sera immédiatement annulé et le code situé sous return next() dans le rappel sera inaccessible.

126
PJCHENder

next() fait partie de connectez le middleware . Les rappels pour le flux du routeur ne s’inquiètent pas si vous renvoyez quoi que ce soit à partir de vos fonctions, donc return next() et next(); return; sont fondamentalement les mêmes.

Si vous souhaitez arrêter le flux de fonctions, vous pouvez utiliser next(err) comme suit:

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

Assez next() est utilisé pour étendre le middleware de vos requêtes.

42
drinchev

Suivant() :

L'appel de cette fonction appelle la fonction middleware suivante dans l'application. La fonction next () ne fait pas partie de Node.js ou de l'API Express, mais constitue le troisième argument transmis à la fonction middleware.

0
Manish sharma