我正在使用快速路由器在我的应用程序中构建路由,并且我正在尝试将自定义中间件应用于每个路由,因此仅当针对该特定路由器的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]);
}
};
我已经构建了registerController方法,因此我可以将不同配置的中间件分配给不同的路由器。每个需要语句的拉入文件名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;
我添加了测试中间件,看看最简单的中间件是否可行,但它没有被调用。我在这里做错了什么?
答案 0 :(得分:2)
构建Express路由器时,设置路由和添加中间件的顺序非常重要。例如,如果添加路由,然后添加中间件,则添加更多路由,只有添加中间件后添加的路由才会调用中间件。在设置中间件之前设置的第一条路由不会触发要调用的中间件。
所以上面我的代码的问题是我正在构建所有路由然后添加中间件,假设添加到路由器的所有中间件都将被调用所有路由。
解决方案是重构并确保我在每个路由器的开头添加中间件。
答案 1 :(得分:1)
您没有看到routerMiddleware
被使用的原因是您在控制器文件中有router.get()
表示已经响应该请求。现在,如果您有POST请求,那么然后将调用您的routerMiddleware
,因为您的控制器文件中没有router.post()
。
Express按照路由/ app的添加顺序评估路由。