Gibt es einen nützlichen Unterschied zwischen app.all('*', ... )
und app.use('/', ...)
in Node.JS Express?
121
In den meisten Fällen würden sie gleichwertig arbeiten. Der größte Unterschied besteht in der Reihenfolge, in der die Middleware angewendet wird:
app.all()
Wird an den Router der Anwendung angehängt und wird daher immer dann verwendet, wenn die Middleware app.router erreicht wird (die alle Methodenrouten verarbeitet ... GET, POST usw.).HINWEIS: app.router ist in Express 4.x veraltet
app.use()
Wird an den Haupt-Middleware-Stack der Anwendung angehängt, sodass er in der von der Middleware angegebenen Reihenfolge verwendet wird. Wenn Sie es beispielsweise an die erste Stelle setzen, wird es als erstes ausgeführt. Wenn Sie es zuletzt (nach dem Router) setzen, wird es normalerweise überhaupt nicht ausgeführt.Wenn Sie global etwas mit allen Routen tun möchten, ist normalerweise app.use () die bessere Option. Außerdem besteht eine geringere Wahrscheinlichkeit für zukünftige Fehler, da Express 0.4 wahrscheinlich den impliziten Router fallen lässt (was bedeutet, dass die Position des Routers in der Middleware wichtiger ist als jetzt, da Sie ihn technisch nicht einmal verwenden müssen jetzt sofort).
next("route")
mit verwendenapp.all
, aber nicht mitapp.use
.app.use verwendet nur eine Rückruffunktion und ist für Middleware gedacht. Middleware verarbeitet normalerweise keine Anforderungen und Antworten (technisch können sie dies), sondern verarbeitet nur Eingabedaten und übergibt sie an den nächsten Handler in der Warteschlange.
app.all nimmt mehrere Rückrufe entgegen und ist für das Routing gedacht. Mit mehreren Rückrufen können Sie Anforderungen filtern und Antworten senden. Es wird in Filter auf express.js erklärt
app.use sieht nur, ob die URL mit dem angegebenen Pfad beginnt
app.all entspricht dem vollständigen Pfad
quelle
app.use:
entsetzen:
Schauen Sie sich dieses ExpressJs-Codebeispiel an:
Hier ist das Protokoll beim Zugriff auf die Route '/ hallo':
quelle
Mit
app.use()
wird der "Mount" -Pfad entfernt und ist für die Middleware-Funktion nicht sichtbar:Bereitgestellte Middleware-Funktionen (
express.static
) werden nur aufgerufen, wenn siereq.url
dieses Präfix (/static
) enthalten. An diesem Punkt wird es beim Aufrufen der Funktion entfernt.Mit
app.all()
gibt es kein solches Verhalten.quelle
Ja,
app.all()
wird aufgerufen, wenn ein bestimmter URI mit einer beliebigen Anforderungsmethode (POST, GET, PUT oder DELETE) angefordert wird.Andererseits
app.use()
wird es für jede Middleware verwendet, die Sie möglicherweise haben, und es wird auf ein Pfadpräfix gemountet und wird jedes Mal aufgerufen, wenn eine URI unter dieser Route angefordert wird.Hier ist die Dokumentation für app.all & app.use .
quelle
Zwei Unterschiede, die alle oben genannten Antworten nicht erfüllen.
Der erste:
app.all
akzeptiert einen regulären Ausdruck als Pfadparameter .app.use
akzeptiert KEINE Regex.Der zweite:
app.all(path,handler)
oderapp[method](path,handler)
, der Handlerpath
muss für alle gleich seinpath
. Dies bedeutet, dass der Pfad von app [method] vollständig ist.app.use(path,hanlder)
Wenn der Pfad der Verwendung vollständig ist, muss der Pfad des Handers '/' sein. Wenn der Pfad der Verwendung der Anfang des vollständigen Pfads ist, muss der Handlerpfad der Rest des vollständigen Pfads sein.quelle
Es gibt zwei Hauptunterschiede:
1. Mustervergleich (Antwort von Palani)
2.
next(route)
Funktioniert nicht im Funktionskörper der mit geladenen Middlewareapp.use
. Dies wird im Link aus den Dokumenten angegeben:Link: http://expressjs.com/en/guide/using-middleware.html
Der Arbeitseffekt von
next('route')
ist aus dem folgenden Beispiel ersichtlich:quelle