【发布时间】:2017-01-04 08:58:16
【问题描述】:
我正在使用快速路由器在我的应用程序中构建路由,并且我正在尝试将自定义中间件应用于每个路由,因此只有在为该特定路由器命中 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 的 require 语句都返回一个像这样的路由器:
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;
我添加了测试中间件以查看最简单的中间件是否可以工作,但它没有被调用。我在这里做错了什么?
【问题讨论】:
-
实际上,不同的调用并没有使用相同的路由器实例。您可能认为这是因为文件顶部有对 express router 的引用。这是我的一个错误,因为它现在是一个未使用的变量。对 registerController 的每次调用都将路由器作为它的第三个参数,并且在每次调用中我都传入了 require 语句的返回值。所有这些 require 语句都返回一个不同的快速路由器实例。
标签: node.js express routing middleware