Express中间件没有被调用

我正在使用快速路由器在我的应用程序中build立路由,我正在尝试将自定义中间件应用到每个路由,因此只有在为特定路由器命中URL时才会调用中间件。 这是我的代码:

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]); } }; 

我已经构build了registerController方法,因此我可以将不同configuration的中间件分配给不同的路由器。 每个需要语句,在文件名xxxController是返回一个路由器是这样的:

 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; 

我添加了testing中间件来查看最简单的中间件是否可以工作,但是没有被调用。 我在这里做错了什么?

你没有看到正在使用routerMiddleware的原因是因为你已经在控制器文件中显示了一个router.get() ,它已经响应了请求。 现在,如果您有POST请求, 那么您的routerMiddleware将被调用,因为您的控制器文件中没有router.post()

Express按其添加到路由器/应用程序的顺序评估路由。

在构buildExpress路由器时,设置路由和添加中间件的顺序非常重要。 例如,如果添加一个路由,那么添加中间件,添加更多路由,只有添加中间件后添加的路由才会导致中间件被调用。 在设置中间件之前设置的第一条path不会触发中间件被调用。

所以我上面的代码的问题是,我正在构build所有的路由,然后添加到中间件,假设所有添加到路由器的中间件将被调用所有路由。

解决scheme是重构并确保在每个路由器的开始处添加中间件。