2016-08-28 8 views
2

Ich benutze Express-Router, um die Routen in meiner Anwendung zu bauen, und ich versuche benutzerdefinierte Middleware auf jede Route anzuwenden, so dass die Middleware nur aufgerufen wird, wenn URLs für diesen bestimmten Router getroffen werden. Hier ist mein Code:Express-Middleware wird nicht aufgerufen

const express = require('express'); 
const router = express.Router(); 
const authentication = require('./helpers/authentication'); 

const registerController = (app, path, router, middleware) => { 
    middleware.forEach((routerMiddleware) => { 
    router.use(routerMiddleware); 
    }); 
    app.use(path, router); 
}; 

const testMiddleware = (request, response, next) => { 
    console.log(request.originalUrl); 
    next(); 
}; 

module.exports = { 
    init: (app) => { 
    registerController(app, '/auth', require('./authenticationController'), [testMiddleware]); 
    registerController(app, '/customer', require('./customerController'), [authentication, testMiddleware]); 
    registerController(app, '/filter', require('./filterController'), [authentication, testMiddleware]); 
    registerController(app, '/', require('./homeController'), [testMiddleware]); 
    registerController(app, '/inventory', require('./inventoryController'), [authentication, testMiddleware]); 
    registerController(app, '/settings', require('./settingsController'), [authentication, testMiddleware]); 
    } 
}; 

ich die registerController Methode aufgebaut haben, so kann ich Middleware in verschiedenen Konfigurationen zu den verschiedenen Routern zuweisen. Jede erfordert Anweisung, die in einem Dateinamen zieht xxxController ist einen Router wie diese Rückkehr:

const router = require('express').Router(); 
const fs = require('fs'); 

router.get('/', (request, response) => { 
    const file = fs.readFileSync(__dirname + '/../index.html', "utf8"); 
    response.send(file); 
}); 

module.exports = router; 

ich die Test-Middleware hinzugefügt, um zu sehen, ob die einfachste Middleware funktionieren würde, aber es wird nicht genannt zu werden. Was mache ich hier falsch?

+0

Tatsächlich verwenden die verschiedenen Anrufe nicht die gleiche Instanz des Routers. Sie denken wahrscheinlich, dass es einen Verweis auf den Router am Anfang der Datei gibt. Dies war ein Fehler meinerseits, da dies jetzt eine ungenutzte Variable ist. Jeder Aufruf von registerController nimmt einen Router als dritten Parameter und bei jedem Aufruf übergebe ich den Rückgabewert einer require-Anweisung. Alle diese erfordern Anweisungen eine andere Instanz von Express-Router zurückgeben. – jdavis

Antwort

1

Der Grund, warum Sie nicht die routerMiddleware verwendet wird, ist, weil Sie eine router.get() in der Controller-Datei haben, die Sie gezeigt haben, die bereits auf die Anfrage reagiert. Wenn Sie stattdessen eine POST-Anfrage hatten, wird dann Ihre routerMiddleware wird aufgerufen, weil es keine router.post() in Ihrer Controller-Datei gibt.

Express wertet Routen in der Reihenfolge aus, in der sie dem Router/der App hinzugefügt wurden.

1

Wenn Sie einen Express-Router erstellen, ist die Reihenfolge, in der Sie die Routen einrichten und Middleware hinzufügen, sehr wichtig. Wenn Sie beispielsweise eine Route hinzufügen und dann Middleware hinzufügen, fügen Sie weitere Routen hinzu. Nur die Routen, die nach dem Hinzufügen der Middleware hinzugefügt wurden, rufen die Middleware auf. Die erste Route, die vor der Einrichtung der Middleware eingerichtet wurde, löst nicht aus, dass die Middleware aufgerufen wird.

Also das Problem mit meinem Code oben ist, dass ich alle Routen baute dann Hinzufügen in der Middleware, unter der Annahme, dass alle Middleware zum Router hinzugefügt würde für alle Routen aufgerufen werden.

Die Lösung war Refactoring und sicherstellen, dass ich die Middleware am Anfang jedes Routers hinzugefügt wurde.