我使用Nodejs,Expressjs和
我不明白next()在中间件中到底是怎么工作的
const { Router } = require('express');
const router = Router();
module.exports = {
mA: router.use((req, res, next) => {
console.log('a');
next();
}),
mB: router.use((req, res, next) => {
console.log('b');
next();
}),
};
const { mA, mB } = require('../middlewares/myMiddleware');
router.get('/welcome'
, mA
,(req, res) => res.render('welcome'));
router.get('/welcome2'
, mB
,(req, res) => res.render('welcome2'));
module.exports = router;
这应该像这样
欢迎->登录
welcome2->登录b
但可以使用
欢迎->登录a,登录b
welcome2->登录a,登录b
为什么?
我该如何解决?这个设计不好吗?
答案 0 :(得分:2)
问题是router.use((req, res, next) => {...})
强制将中间件应用于整个路由器。
此处未正确定义中间件。如手册所述,
中间件功能是可以访问请求对象(req),响应对象(res)和应用程序请求-响应周期中的下一个中间件功能的功能。下一个中间件功能通常由名为next的变量表示。
mA
和mB
是已经应用了中间件的路由器实例。
它们应该是:
module.exports = {
mA: (req, res, next) => {
console.log('a');
next();
},
mB: (req, res, next) => {
console.log('b');
next();
},
};
答案 1 :(得分:0)
next()是Express框架公开的功能。它不是Nodejs的一部分,而是Expressjs的一部分。根据快递文件 “中间件功能是可以访问请求对象(req),响应对象(res)和应用程序请求-响应周期中的下一个功能的功能。下一个功能是Express路由器中的功能,调用该功能时,在当前中间件之后执行中间件。”
希望这对您有所帮助。
谢谢