Bevor ich danach frage app.router
, sollte ich zumindest erklären, was meiner Meinung nach bei der Arbeit mit Middleware passiert. Um Middleware zu verwenden, ist die zu verwendende Funktion app.use()
. Wenn die Middleware ausgeführt wird, wird entweder die nächste Middleware mithilfe von next()
aufgerufen oder so eingestellt, dass keine Middleware mehr aufgerufen wird. Das bedeutet, dass die Reihenfolge, in der ich meine Middleware-Aufrufe platziere, wichtig ist, da einige Middleware von anderer Middleware abhängt und einige Middleware gegen Ende möglicherweise nicht einmal aufgerufen wird.
Heute habe ich an meiner Anwendung gearbeitet und meinen Server im Hintergrund laufen lassen. Ich wollte einige Änderungen vornehmen und meine Seite aktualisieren und die Änderungen sofort sehen. Insbesondere habe ich Änderungen an meinem Layout vorgenommen. Ich konnte es nicht zum Laufen bringen, also suchte ich im Stapelüberlauf nach der Antwort und fand diese Frage . Es heißt, um sicherzustellen, dass express.static()
das darunter ist require('stylus')
. Aber als ich mir den Code dieses OP ansah, sah ich, dass er seinen app.router
Anruf ganz am Ende seiner Middleware-Anrufe hatte, und ich versuchte herauszufinden, warum das so war.
Als ich meine Express.js-Anwendung (Version 3.0.0rc4) erstellt habe, habe ich den Befehl verwendet express app --sessions --css stylus
und in meiner app.js-Datei wurde der Code mit meinem app.router
obigen Aufruf express.static()
und eingerichtet require('stylus')
. Wenn es also bereits so eingerichtet ist, sollte es so bleiben.
Nachdem ich meinen Code neu angeordnet habe, damit ich meine Stylus-Änderungen sehen kann, sieht es folgendermaßen aus:
app.configure(function(){
//app.set() calls
//app.use() calls
//...
app.use(app.router);
app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(__dirname + '/public', {maxAge: 31557600000}));
});
app.get('/', routes.index);
app.get('/test', function(req, res){
res.send('Test');
});
Deshalb habe ich beschlossen, dass der erste Schritt darin besteht, herauszufinden, warum es wichtig ist, überhaupt einen app.router
Code zu haben. Also habe ich es auskommentiert, meine App gestartet und zu navigiert /
. Es zeigte meine Indexseite ganz gut. Hmm, vielleicht hat es funktioniert, weil ich das Routing aus meiner Routendatei (route.index) exportiert habe. Als nächstes navigierte ich zu /test
und es zeigte Test auf dem Bildschirm an. Haha, OK, ich habe keine Ahnung was app.router
macht. Unabhängig davon, ob es in meinem Code enthalten ist oder nicht, ist mein Routing in Ordnung. Mir fehlt also definitiv etwas.
Hier ist meine Frage:
Könnte jemand bitte erklären, was es app.router
tut, wie wichtig es ist und wo ich es in meine Middleware-Aufrufe einfügen soll? Es wäre auch schön, wenn ich eine kurze Erklärung dazu bekommen würde express.static()
. Soweit ich das beurteilen kann, express.static()
handelt es sich um einen Cache meiner Informationen. Wenn die Anwendung die angeforderte Seite nicht finden kann, überprüft sie den Cache, um festzustellen, ob sie vorhanden ist.
quelle
Antworten:
Hinweis: Hier wird beschrieben, wie Express in den Versionen 2 und 3 funktioniert. Informationen zu Express 4 finden Sie am Ende dieses Beitrags.
static
stellt einfach Dateien ( statische Ressourcen) von der Festplatte bereit. Sie geben ihm einen Pfad (manchmal auch als Einhängepunkt bezeichnet) und er dient den Dateien in diesem Ordner.Zum Beispiel
express.static('/var/www')
würde die Dateien in diesem Ordner dienen. Eine Anfrage an Ihren Node-Server fürhttp://server/file.html
würde also dienen/var/www/file.html
.router
ist Code, der Ihre Routen ausführt. Wenn Sie dies tunapp.get('/user', function(req, res) { ... });
,router
ruft tatsächlich die Rückruffunktion auf, um die Anforderung zu verarbeiten.Die Reihenfolge, in der Sie die Dinge übergeben,
app.use
bestimmt die Reihenfolge, in der jede Middleware die Möglichkeit erhält, eine Anforderung zu verarbeiten. Wenn Sie beispielsweise eine Dateitest.html
in Ihrem statischen Ordner und eine Route aufgerufen haben :Welches wird an einen Kunden gesendet, der dies anfordert
http://server/test.html
? Welche Middlewareuse
zuerst gegeben wird.Wenn du das tust:
Dann wird die Datei auf der Festplatte bereitgestellt.
Wenn Sie es anders machen,
Dann erhält der Routen-Handler die Anfrage und "Hallo vom Routen-Handler" wird an den Browser gesendet.
Normalerweise möchten Sie den Router über der statischen Middleware platzieren, damit eine versehentlich benannte Datei eine Ihrer Routen nicht überschreiben kann.
Beachten Sie, dass , wenn sie nicht ausdrücklich
use
dierouter
es implizit durch Express an dem Punkt Sie eine Route definieren hinzugefügt wird (weshalb Ihre Routen noch einmal gearbeitet , obwohl Sie auf Kommentarapp.use(app.router)
).Ein Kommentator hat einen weiteren Punkt zur Reihenfolge von
static
undrouter
angesprochen, den ich nicht angesprochen hatte: die Auswirkungen auf die Gesamtleistung Ihrer App.Ein weiterer Grund für
use
router
obenstatic
zu optimieren Leistung. Wenn Siestatic
zuerst setzen , drücken Sie bei jeder einzelnen Anforderung auf die Festplatte, um festzustellen, ob eine Datei vorhanden ist oder nicht. In einem schnellen Test stellte ich fest, dass dieser Overhead auf einem entladenen Server ~ 1 ms betrug. (Diese Zahl ist unter Last sehr wahrscheinlich höher, wenn Anforderungen um den Festplattenzugriff konkurrieren.)Mit
router
zunächst eine Anforderung einer Route passend hat nie die Scheibe zu schlagen, spart wertvolle Millisekunden.Natürlich gibt es Möglichkeiten, den
static
Overhead zu verringern .Am besten legen Sie alle statischen Ressourcen in einem bestimmten Ordner ab. (IE
/static
) Sie könnenstatic
diesen Pfad dann so bereitstellen, dass er nur ausgeführt wird, wenn der Pfad beginnt mit/static
:In dieser Situation würden Sie dies oben setzen
router
. Dies vermeidet die Verarbeitung anderer Middleware / des Routers, wenn eine Datei vorhanden ist, aber um ehrlich zu sein, bezweifle ich, dass Sie so viel gewinnen werden.Sie können auch
staticCache
statische Ressourcen im Arbeitsspeicher zwischenspeichern, damit Sie nicht auf die Festplatte zugreifen müssen, um häufig angeforderte Dateien zu erhalten. ( Warnung:staticCache
wird anscheinend in Zukunft entfernt.)Ich glaube jedoch nicht, dass
staticCache
negative Antworten zwischengespeichert werden (wenn eine Datei nicht vorhanden ist). Daher hilft es nicht, wenn SiestaticCache
oben angegeben haben,router
ohne sie an einen Pfad anzuhängen.Wie bei allen Fragen zur Leistung können Sie Ihre reale App (unter Last) messen und bewerten , um festzustellen , wo die Engpässe tatsächlich liegen.
Express 4
Express 4.0 wird entfernt
app.router
. Alle Middleware (app.use
) und Routen (app.get
et al.) Werden jetzt genau in der Reihenfolge verarbeitet, in der sie hinzugefügt werden.Mit anderen Worten:
Lesen Sie mehr über Änderungen in Express 4.
quelle
router
geht an einem Ort. Wenn Sie das erste Mal aufrufenapp.get
(oderpost
oder andere), haben Sie noch nichtuse
dapp.router
, fügt Express es für Sie.static
nachrouter
wird die Frage nach der anderen Middleware nicht relevant , da es muss über dem Router sein.app.router
wird entfernt , in dem aktuellen Master - Zweig, der seiner Express-4.0 . Jede Route wird zu einer separaten Middleware.quelle
In der Express-Version 4 können wir Routen auf folgende Weise einfach definieren:
server.js:
route.js:
In haben
server.js
wir das Router-Objekt derroute.js
Datei importiert und auf folgende Weise angewendetserver.js
:Jetzt haben alle Routen in
route.js
der folgenden Basis-URL:http: // localhost: 3000 / route
Warum dieser Ansatz:
Der Hauptvorteil dieses Ansatzes besteht darin, dass unsere App jetzt modularer ist . Alle Routenhandler für eine bestimmte Route können jetzt in verschiedenen Dateien abgelegt werden, wodurch alles wartbarer und leichter zu finden ist.
quelle