2013-05-29 6 views
66

Szenario: Betrachten Sie das Folgende ist der Teil des Codes von einer Node Web App.Wann next() und next() in Node.js verwendet werden soll

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

Ausgabe: Ich bin Überprüfung, welche mit nur next() oder return next() zu gehen. Der obige Beispielcode funktioniert genau gleich für beide & zeigte keinen Unterschied in der Ausführung.

Frage: Kann jemand Put-Licht auf diese, wenn next() zu verwenden und wenn return next() und einige wichtige Unterschied zu benutzen?

Antwort

63

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

Wenn Sie es nicht tun, riskieren Sie den Rückruf später ein zweites Mal, was in der Regel verheerende Folgen hat. Der Code ist in Ordnung, wie es ist, aber ich würde es umschreiben als:

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

    if(!id) 
     return next(); 

    // do something 
}); 

Es spart mir eine Einrückungsebene, und wenn ich den Code später noch einmal lesen, ich bin sicher, es gibt keine Möglichkeit, next genannt wird zweimal .

35

next() ist Teil von connect middleware. Callbacks für Router-Flow ist es egal, wenn Sie etwas von Ihren Funktionen zurückgeben, so return next() und next(); return; ist im Grunde das gleiche.

Falls Sie den Fluss von Funktionen stoppen Sie next(err) wie folgt

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() für die Erweiterung der Middleware Ihrer Anfragen verwendet wird ziemlich verwenden können.

+0

Können wir Parameter senden wie: 'next ('No ID')'? –

+5

'next ('No ID')' sendet tatsächlich einen Fehler, der den Fluss unterbricht. – drinchev

+0

Verwenden Sie next (null, "somevalue"); Bei Tools wie async.waterfall wird der Wert an die nächste Funktion übergeben. Für komplexe Reihe von Interaktionen, die datengesteuert sind, übergebe ich normalerweise ein Kontextobjekt zwischen Funktionen. Auf diese Weise kann ich generische Funktionen erstellen, die über mehrere Endpunkte verteilt werden können und den Fluss über Daten im Kontext steuern. –

28

Als @Laurent Perrin Antwort:

Wenn Sie es nicht tun, riskieren Sie später den Rückruf ein zweites Mal Auslösung, die in der Regel verheerende Ergebnisse

ich ein Beispiel geben hier hat 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 finden heraus, dass die Ausgabe in der Konsole ist:

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

Das heißt, es führt den Code weiter unten() nach alle Middleware-Funktion beendet. Wenn Sie jedoch return next() verwenden, springt der Rückruf sofort aus und der Code unter return next() im Rückruf ist nicht erreichbar.

+1

Als Anfänger zu 'Express' machte diese Antwort die Dinge klarer als die anderen Antworten. Daumen hoch! – mandarin