Node.js多种中间件导出模式

时间:2018-07-23 12:12:34

标签: node.js express web

我使用Nodejs,Expressjs和
我不明白next()在中间件中到底是怎么工作的

middleware / myMiddleware.js

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();
  }),
};

routes / myRoute.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;

这应该像这样
欢迎->登录
welcome2->登录b

但可以使用
欢迎->登录a,登录b
welcome2->登录a,登录b
为什么?
我该如何解决?这个设计不好吗?

2 个答案:

答案 0 :(得分:2)

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

此处未正确定义中间件。如手册所述,

  

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

mAmB是已经应用了中间件的路由器实例。

它们应该是:

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路由器中的功能,调用该功能时,在当前中间件之后执行中间件。”

希望这对您有所帮助。

谢谢