Angenommen, Sie haben einen einfachen Codeblock wie diesen:
app.get('/', function(req, res){
res.send('Hello World');
});
Diese Funktion hat zwei Parameter req
und res
, die die Anforderungs- bzw. Antwortobjekte darstellen.
Andererseits gibt es andere Funktionen, bei denen ein dritter Parameter aufgerufen wird next
. Schauen wir uns zum Beispiel den folgenden Code an:
app.get('/users/:id?', function(req, res, next){ // Why do we need next?
var id = req.params.id;
if (id) {
// do something
} else {
next(); // What is this doing?
}
});
Ich kann nicht verstehen, worum es next()
geht oder warum es verwendet wird. Wenn in diesem Beispiel keine ID vorhanden ist, was wird dann next
tatsächlich ausgeführt?
res.send
, um die Anforderung abzuschließen , wenn sie vorhanden ist . Wenn es nicht vorhanden ist, gibt es wahrscheinlich einen anderen Handler, der einen Fehler ausgibt und die Anforderung dann abschließt.app.post('/login',function(req,res))
After-app.get('/users',function(req,res))
Call-Login, das die nächste Route in der Datei app.js ist, indem Sie next () aufrufen?app.get("/users")
, wird sie ausgeführt, wenn der oben angegebene Handler das nächste Mal anruft.Antworten:
Es übergibt die Kontrolle an die nächste passende Route. In dem Beispiel, das Sie beispielsweise
id
angeben, können Sie den Benutzer in der Datenbank nachschlagen, wenn ein angegeben wurde, und ihn zuweisenreq.user
.Unten könnten Sie eine Route haben wie:
Da / users / 123 zuerst mit der Route in Ihrem Beispiel übereinstimmt, wird zuerst der Benutzer überprüft und gefunden
123
. dann/users
kann man etwas daraus machen.Die Route Middleware ist meiner Meinung nach ein flexibleres und leistungsfähigeres Tool, da sie nicht auf einem bestimmten URI-Schema oder einer bestimmten Routenreihenfolge basiert. Ich würde das gezeigte Beispiel gerne
Users
modellieren , wenn ich ein asynchrones Modell annehmefindOne()
:In der Lage zu sein, den Fluss so zu steuern, ist ziemlich praktisch. Möglicherweise möchten Sie, dass bestimmte Seiten nur Benutzern mit einem Admin-Flag zur Verfügung stehen:
Hoffe das hat dich inspiriert!
quelle
next()
wieder anrufe . Es wäre dasselbe, wenn ich es nur benutzen würdenext(new Error(…)); return;
.next(new Error(…)); return;
. Wenn wir einen Wert an übergebennext
, wird dies einseitig als Fehler betrachtet . Ich habe nicht zu viel in den Express-Code geschaut, aber stöbern Sie herum und Sie werden finden, was Sie brauchen :)return next(…);
,next(…); return;
damit es weniger verwirrend ist.)Ich hatte auch Probleme beim Verstehen von next (), aber das half
quelle
.get
aufgerufen wird und nicht der zweite?Bevor Sie verstehen
next
, müssen Sie eine kleine Vorstellung vom Anforderungs-Antwort-Zyklus im Knoten haben, wenn auch nicht sehr detailliert. Es beginnt damit, dass Sie eine HTTP-Anfrage für eine bestimmte Ressource stellen, und endet, wenn Sie eine Antwort an den Benutzer zurücksenden, dh wenn Sie auf etwas wie res.send ('Hello World') stoßen.Schauen wir uns ein sehr einfaches Beispiel an.
Hier brauchen wir next () nicht, da resp.send den Zyklus beendet und die Steuerung an die Route Middleware zurückgibt.
Schauen wir uns nun ein anderes Beispiel an.
Hier haben wir 2 Middleware-Funktionen für den gleichen Pfad. Aber Sie werden immer die Antwort vom ersten bekommen. Da dies zuerst im Middleware-Stack bereitgestellt wird und res.send den Zyklus beendet.
Aber was ist, wenn wir immer nicht die "Hallo Welt !!!!" wollen? Antwort zurück. Für einige Bedingungen möchten wir vielleicht den "Hallo Planeten !!!!" Antwort. Lassen Sie uns den obigen Code ändern und sehen, was passiert.
Was ist
next
hier los ? Und ja, Sie könnten Gusses haben. Wenn die Bedingung erfüllt ist, wird die erste Middleware-Funktion übersprungen und die nächste Middleware-Funktion aufgerufen, und Sie erhalten die"Hello Planet !!!!"
Antwort.Übergeben Sie das Steuerelement als Nächstes an die nächste Funktion im Middleware-Stack.
Was ist, wenn die erste Middleware-Funktion keine Antwort zurücksendet, sondern eine Logik ausführt und Sie die Antwort von der zweiten Middleware-Funktion zurückerhalten.
So etwas wie unten: -
In diesem Fall müssen beide Middleware-Funktionen aufgerufen werden. Der einzige Weg, um zur zweiten Middleware-Funktion zu gelangen, ist der Aufruf von next ().
quelle
next()
wie eingoto
mit einem fest verdrahteten Etikett? Das heißt, in Ihrem dritten Snippet würde, sobald Sie anrufennext()
,res.send("Hello World !!!!");
nie ausgeführt werden? Ich bemerkte, dass @Ashe immer einenreturn;
After Call hattenext
, der Code im selben Ausführungsbaum hatte ... Ich schätze, ich konnte immer nur Express einchecken, oder?next()
Aufruf wird aufgerufen . In diesem Fallpast the next() call
wird in die Konsole geschrieben, und dann erhalte ich eineError: Can't set headers after they are sent.
Fehlermeldung, wie die zweiteres.send
aufgerufen wird, wenn auch erfolglos. Der Code-Fluss kehrt nach demnext()
Aufruf zurück, was @ Ashe'sreturns
(oder eine andere Logikverwaltung) wichtig macht.next()
, um die Ausführung der verbleibenden Anweisungen zu überspringen. Vielen Dank für den Hinweis.Mit Next wird die Steuerung an die nächste Middleware-Funktion übergeben. Wenn nicht, bleibt die Anfrage hängen oder offen.
quelle
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. Die next () -Funktion kann beliebig benannt werden, wird jedoch konventionell immer als "next" bezeichnet.
quelle
Durch Ausführen der
next
Funktion wird der Server benachrichtigt, dass Sie mit diesem Middleware-Schritt fertig sind, und er kann den nächsten Schritt in der Kette ausführen.quelle