it-swarm.com.de

Verwendung von next () und Rückkehr zu next () in Node.js

Szenario: Beachten Sie, dass Folgendes der Teil des Codes einer Node-Webanwendung ist.

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

Problem: Ich überprüfe gerade, welches mit next() oder return next() zu tun hat. Der obige Beispielcode funktioniert für beide genau gleich und zeigte keinen Unterschied in der Ausführung.

Frage: Kann jemand Aufschluss darüber geben, wann next() und wann return next() und einen wichtigen Unterschied zu verwenden sind?

107
Amol M Kulkarni

Einige Leute schreiben immer return next(), um sicherzustellen, dass die Ausführung nach dem Auslösen des Rückrufs stoppt.

Wenn Sie dies nicht tun, riskieren Sie, den Rückruf ein zweites Mal später auszulösen, was normalerweise verheerende Folgen hat. Ihr Code ist in Ordnung, aber ich würde ihn wie folgt umschreiben:

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

    if(!id)
        return next();

    // do something
});

Das erspart mir eine Einrückungsstufe, und wenn ich den Code später noch einmal lese, gibt es bestimmt keine Möglichkeit, next zweimal aufzurufen.

114
Laurent Perrin

Als Antwort von @Laurent Perrin:

Wenn Sie dies nicht tun, riskieren Sie, den Rückruf ein zweites Mal später auszulösen, was normalerweise verheerende Folgen hat

Ich gebe hier ein Beispiel, wenn Sie Middleware wie folgt schreiben:

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

Sie werden feststellen, dass die Ausgabe in der Konsole:

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

Das heißt, der folgende Code wird ausgeführt, nachdem alle Middleware-Funktionen abgeschlossen wurden.

Wenn Sie jedoch return next() verwenden, wird der Rückruf sofort abgebrochen und der Code unter return next() im Rückruf ist nicht erreichbar.

126
PJCHENder

next() ist Teil von connect middleware . Rückrufe für den Router-Datenfluss sind nicht wichtig, wenn Sie etwas von Ihren Funktionen zurückgeben. Daher sind return next() und next(); return; im Grunde dasselbe.

Wenn Sie den Funktionsfluss stoppen möchten, können Sie next(err) wie folgt verwenden

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

Ziemlich viel next() wird verwendet, um die Middleware Ihrer Anforderungen zu erweitern.

42
drinchev

Nächster() :

Durch Aufrufen dieser Funktion wird die nächste Middleware-Funktion in der App aufgerufen. Die next () - Funktion ist kein Teil der Node.js- oder Express-API, sondern das dritte Argument, das an die Middleware-Funktion übergeben wird.

0
Manish sharma