【发布时间】:2019-01-26 03:35:40
【问题描述】:
使用 Express 和 Express 路由器。我在一个目录中有几个文件都实现了Express.Router。我动态地要求它们,添加一些中间件,然后将它们附加到“元”路由器,最后调用app.use("/",MetaRouter)。
我的问题是每个路由都会多次调用中间件。
这里是/index.js:
const express = require('express')
const bodyParser = require('body-parser');
const app = express();
const port = 4000;
var cors = require('cors')
var routes = require('./routes');
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(routes);
app.listen(port, '0.0.0.0', () => console.log(`Example app listening on port ${port}!`))
这需要/routes/index.js:
const fs = require('fs');
const path = require('path');
var express = require('express');
var MetaRouter = express.Router();
var passport = require('passport');
const files = fs.readdirSync(__dirname).filter(file => file !== 'index.js');
const fileModules = {};
var middleware = function(req, res, next) {
console.log('In The Middleware');
next();
}
files.forEach(file => {
const { name } = path.parse(file);
fileModules[name] = require(`./${name}`);
});
Object.entries(fileModules).forEach(([key, _router]) => {
_router.use(middleware);
MetaRouter.use(_router);
});
module.exports = MetaRouter;
下面是目录中路由器文件之一的示例:
const BoxRequestService = require("../services/request/box_request_service.js");
var express = require('express');
var router = express.Router();
router.get('/box',
async function (req, res) {
res.json(await BoxRequestService.getAll(req, res));
});
router.get('/box/:id',
async function (req, res) {
res.json(await BoxRequestService.findById(req, res));
}
);
router.put('/box/:id',
async function (req, res) {
res.json(await BoxRequestService.update(req, res));
});
router.post('/box', async function (req, res) {
res.json(await BoxRequestService.create(req, res));
});
module.exports = router;
预期结果
所以当请求http://localhost/box 时,我希望在控制台中恰好看到一次“In The Middleware”。
实际结果
相反,我看到“在中间件中”记录了多次。它还取决于所需文件的顺序。因此,鉴于此文件列表(按此顺序需要):
- /routes/A.js
- /routes/B.js
- /routes/C.js
- /routes/D.js
如果请求A.js 中的路由,则调用一次中间件。
如果请求B.js 中的路由,则会调用中间件两次。
如果请求C.js 中的路由,则会调用中间件 3 次。
等等
等等
【问题讨论】: