2016-04-05 5 views
0

Ich bin Neuling in Express und ein wenig verwirrt darüber, wie es behandelt Middlewares? Also im Grunde habe ich zwei Middle, die wie folgt aussieht:Wie Express Middlewares aufnimmt?

app.use(require('_/app/middlewares/errors/404')) 
app.use(require('_/app/middlewares/errors/500')) 

var log = require('_/log') 

module.exports = function (req, res, next) { 
    log.warn('page not found', req.url) 
    res.status(404).render('errors/404') 
} 

var log = require('_/log') 

module.exports = function (er, req, res, next) { 
    log.error(er.message) 

    res.locals.error = er 
    res.status(500).render('errors/500') 
} 

So, jetzt ich meine benutzerdefinierte Middleware app.use(require('_/app/middleware/shareLocals')) hinzufügen möchten, die wie folgt aussieht :

module.exports = function (req, res, next) { 
    res.locals.base_url = req.protocol + '://' + req.get('host'); 

    next(); 
} 

Das Hauptproblem ist, dass jetzt, wenn ich versuche base_url zu verwenden ich 404 Fehler bekommen ...

Wie Express versteht, was Middleware tun? Das ist zwischen meiner Middleware und 404 sind keine visuellen Unterschiede:

  • erhält es gleiche params
  • es keine if's darin hat, wirft nur 404 Fehler

Erscheint das Gefühl das die Middle in Express sind für Fehler gemacht (wenn Ausnahmen Fehler als erster Parameter) und für 404 (wenn es keinen ersten Fehler gibt) ...

PS Gibt es einen Unterschied zwischen Middlewares vor oder nach den Routen?

Antwort

1

P.S. Gibt es einen Unterschied zwischen Middlewares vor oder nach den Routen? Ja.

Die Reihenfolge, in der Sie Ihre Middlewares (und Routen) registrieren, hat viel zu sagen.

Bild als eine riesige Liste ausdrücken. Beginnend mit dem ersten Element in der Liste haben Sie die erste Middleware ODER Route, die Sie definiert haben, die nächste ist die zweite, usw.

Wenn express eine Anfrage erhält, scheint sie mit Ihrer Route/Name der Route/Middleware übereinzustimmen und wenn es ein Treffer ist, führt es die Middleware/Route aus und wartet möglicherweise auf einen "next()" -Aufruf.

Wenn Sie also eine Route "/ test" haben, wird diese nur ausgeführt, wenn Sie eine Anfrage mit "/ test" haben. Routen mit verschiedenen Namen werden offensichtlich nicht ausgelöst. Middlewares können auch Namen haben: app.use ("/ test", middlewareA). Dies wird auch nur ausgelöst, wenn "/ test" angefordert wird. So wie Sie es tun, werden alle Anfragen (innerhalb des Namensraums der Routen) app.use (middlewareA) ausgelöst. Es ist wie eine Wildcard.

Jetzt zu den Implikationen der Dinge bestellt werden: Ihre 404 Middleware sollte nur verwendet werden, nachdem alle Routen definiert worden sind. Wenn die Liste die Middleware 404 erreicht hat, wurden keine Routen gefunden.

Das Zurücksenden/Senden von Ergebnissen/das Nichtaufrufen von next() am Ende einer Middleware führt möglicherweise zu Problemen in Ihrem Datenfluss.Ich werde darauf nicht näher eingehen, aber sei dir dessen bewusst.

ich Ihre eigene Middleware bin zu raten, nach der 404-Middleware hinzugefügt. Das ist wahrscheinlich das Problem. Wenn nicht, sollten Sie mehr von Ihrem Code abgeben, damit wir besser sehen können. Aber denken Sie daran, Ordnung ist alles :)

Verwandte Themen