2016-05-16 10 views
1

ich eine App mit Controllern in mehrere Dateien, wie folgt aus:eine Express-Middleware-Funktion für alle verwenden aber einen Controller

var aRoutes = require('./controllers/controllerA'); 
var bRoutes = require('./controllers/controllerB'); 
var cRoutes = require('./controllers/controllerC'); 

app.use('/a', aRoutes); 
app.use('/b', bRoutes); 
app.use('/c', cRoutes); 
// ... several more 

Und ich habe eine Middleware-Funktion wie folgt ...

app.use(function (req, res, next) { 
    // do a middleware thing 
    // but not if route == x or y or z or ... yuck! 
}); 

Und ich möchte, dass die Middleware auf alles läuft außer die aRoutes. Ich habe eine Antwort like this gesehen, die schlägt vor, einen Check in der Middleware Fn für jede Route auszuschließen, aber das ist schrecklich, denke ich. Es kann viele Routen geben, die überprüft werden müssen, und es zwingt mich, den Code an zwei Stellen zu berühren, wenn ich eine dieser Ausnahmerouten hinzufüge.

Es muss einen besseren Weg geben, oder?

+0

Verwenden Sie separate Router und legen Sie den Middleware-Aufruf in die Router, in denen Sie sie möchten, und nicht in die Router, die Sie nicht möchten. Solange jeder Router seinen eigenen Pfad hat (was so aussieht), werden Sie festgelegt. – jfriend00

Antwort

1

Angenommen, ich verstehe Sie richtig, Sie könnten es lösen, indem Sie die Reihenfolge der Middleware und Routen neu anordnen.

var aRoutes = require('./controllers/controllerA'); 
var bRoutes = require('./controllers/controllerB'); 
var cRoutes = require('./controllers/controllerC'); 

app.use('/a', aRoutes); 

app.use('/',function (req, res, next) { 
    // do a middleware thing 
    next(); 
}); 

app.use('/b', bRoutes); 
app.use('/c', cRoutes); 
// ... several more 

Nun, wenn Sie Ihr Ende aRoutes mit einem res.render oder einer anderen Aktion, die den Request-Response-Zyklus endet und nicht mit einem next(), wird die Middleware nie auf den aRoutes laufen.

Es wird jedoch auf allen anderen Routen ausgeführt. Dies funktioniert natürlich nur, wenn die Middleware den Anfrage-Antwort-Zyklus starten soll. Wenn Sie es woanders haben wollen, müssen Sie den Code entsprechend neu anordnen.

Verwandte Themen