Node.js多中间件导出模式

Node.js多中间件导出模式,node.js,express,web,Node.js,Express,Web,我使用Nodejs、Expressjs和 我不明白next()在中间件中到底是如何工作的 中间件/myMiddleware.js routes/myRoute.js 这应该是这样的 欢迎->登录a 欢迎2->日志b 但它是有效的 欢迎->日志a、日志b 欢迎2->日志a、日志b 为什么? 我怎样才能修好它?这是一个糟糕的设计吗?next()是一个由Express framework公开的函数。它不是Nodejs的一部分,而是Expressjs的一部分。根据明示文件 中间件功能是指可以访问请求对象

我使用Nodejs、Expressjs和
我不明白next()在中间件中到底是如何工作的

中间件/myMiddleware.js routes/myRoute.js 这应该是这样的
欢迎->登录a
欢迎2->日志b

但它是有效的
欢迎->日志a、日志b
欢迎2->日志a、日志b
为什么?
我怎样才能修好它?这是一个糟糕的设计吗?

next()是一个由Express framework公开的函数。它不是Nodejs的一部分,而是Expressjs的一部分。根据明示文件 中间件功能是指可以访问请求对象(req)、响应对象(res)和应用程序请求-响应周期中的下一个功能的功能。下一个功能是Express router中的一个功能,当被调用时,它将执行继当前中间件之后的中间件

希望这对你有帮助


谢谢

问题在于
路由器。use((req,res,next)=>{…})
强制将中间件应用于整个路由器

这里没有正确定义中间件。如手册所述

中间件功能是可以访问请求对象(req)、响应对象(res)和应用程序请求-响应周期中的下一个中间件功能的功能。next中间件函数通常由名为next的变量表示

mA
mB
是已经应用了中间件的路由器实例

它们应该是:

module.exports = {
  mA: (req, res, next) => {
    console.log('a');
    next();
  },
  mB: (req, res, next) => {
    console.log('b');
    next();
  },
};

不要使用next,因为它不是mandatory@Devrajverma感谢您的评论:)但是如果没有next(),它将无法工作。页面不显示。如果没有next(),中间件可能无法将请求传递到route。但预计下一个中间件(route handler)将在mA和mB之后在此执行。谢谢,我只是将中间件移动到app.js!:)
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;
module.exports = {
  mA: (req, res, next) => {
    console.log('a');
    next();
  },
  mB: (req, res, next) => {
    console.log('b');
    next();
  },
};