Szenario : Beachten Sie, dass der folgende Teil des Codes aus einer Knoten-Webanwendung stammt.
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, mit welchem ich gerade next()
oder gehen soll return next()
. Der obige Beispielcode funktioniert für beide genau gleich und zeigte keinen Unterschied in der Ausführung.
Frage : Kann jemand Licht ins Dunkel bringen, wann next()
und wann man es benutzt return next()
und einen wichtigen Unterschied?
res.redirect('/')
vs.return res.redirect('/')
in einer solchen Situation? Vielleicht ist es einfach besser, return immer vor res-Anweisungen zu schreiben, um Fehler beim Festlegen von Headern nach dem Senden zu vermeiden?Als Antwort von @Laurent Perrin:
Ich gebe hier ein Beispiel, wenn Sie Middleware wie diese schreiben:
Sie werden feststellen, dass die Ausgabe in der Konsole ist:
Das heißt, es wird der folgende Code next () ausgeführt, nachdem alle Middleware-Funktionen beendet wurden.
Wenn Sie jedoch verwenden
return next()
, wird der Rückruf sofort übersprungen und der untenreturn next()
im Rückruf angegebene Code ist nicht erreichbar.quelle
express
dieser Antwort wurden mir die Dinge klarer als die anderen Antworten. Daumen hoch!res.redirect('/')
vs.return res.redirect('/')
in einer solchen Situation? Vielleicht ist es einfach besser, immerreturn
vorres
Anweisungen zu schreiben , um Fehler beim Festlegen von Headern nach dem Senden zu vermeiden?next()
ist Teil der Connect Middleware . Rückrufe für den Routerfluss kümmern sich nicht darum, ob Sie etwas von Ihren Funktionen zurückgeben,return next()
undnext(); return;
sind im Grunde dasselbe.Wenn Sie den Funktionsfluss stoppen möchten, können Sie
next(err)
Folgendes verwendenZiemlich viel
next()
wird verwendet, um die Middleware Ihrer Anfragen zu erweitern.quelle
next('No ID')
?next('No ID')
sendet tatsächlich einen Fehler, der den Fluss unterbricht.Es ist am besten, es überhaupt nicht zu benutzen! Ich erkläre, und das erkläre ich auch.
Die next () -Funktion, die einen beliebigen Namen haben kann und gemäß Konvention auf next gesetzt wurde. Es hängt indirekt mit den Operationen (PUT, GET, DELETE, ...) zusammen, die beispielsweise im Allgemeinen auf derselben URI-Ressource ausgeführt werden
/ user /: id
Wenn Sie sich nun app.get ansehen, verwenden app.put und app.delete dieselbe URL (/ user /: id). Das einzige, was sie unterscheidet, ist ihre Implementierung. Wenn die Anforderung gestellt wird (req) express, wird die Anforderung in app.get an die erste Stelle gesetzt. Wenn eine von Ihnen erstellte Validierung fehlschlägt, weil diese Anforderung nicht für diesen Controller gilt, wird die Anforderung an app.put übergeben, die die nächste Route in der Datei darstellt auf. Wie im folgenden Beispiel zu sehen.
Das Problem besteht darin, dass Sie am Ende die Anforderung an alle Controller weitergeben, in der Hoffnung, dass es eine gibt, die durch die Validierung der Anforderung das tut, was Sie wollen. Am Ende erhalten alle Controller etwas, das nicht für sie ist :(.
Wie vermeide ich das Problem von next () ?
Die Antwort ist wirklich einfach.
1- Es sollte nur einen Uri geben , um eine Ressource zu identifizieren
http: // IpServidor / colection /: resource / colection /: resource Wenn Ihr URI länger ist, sollten Sie eine neue URL erstellen
Beispiel http: // IpServidor / users / pepe / contact / contacto1
2-Alle Operationen an dieser Ressource müssen unter Berücksichtigung der Idempotenz der Verben http (get, post, put, delete, ...) ausgeführt werden, damit der Aufruf einer URI wirklich nur eine Möglichkeit zum Aufrufen hat
Weitere Informationen [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resources‹[1]
Mal sehen, den Code! Die konkrete Implementierung, durch die wir die Verwendung von next () vermeiden!
In der Datei index.js
In der Datei usersRoute.js
Jetzt macht die Datei usersRoute.js das, was von einer Datei namens usersRoute erwartet wird, nämlich die Verwaltung der Routen des URI / users /
// Datei getUsersController.js
Auf diese Weise vermeiden Sie die Verwendung von next, entkoppeln den Code, gewinnen an Leistung, entwickeln SOLID, lassen die Tür für eine mögliche Migration zu Microservices offen und sind vor allem für einen Programmierer leicht lesbar.
quelle
Nächster() :
quelle