定制功能中的链中间件功能

时间:2019-07-31 06:15:19

标签: javascript node.js express

我知道在经过这样的路由后我可以链接中间件功能

const express = require('express');
const router = express.Router();
router.post('/', middlewareFunction1, middlewareFunction2, controllerFunction);
module.exports = router;

我想知道是否只能调用一个功能(称为网关)

router.post('/', gatewayFunction1);

并且此功能可以链接所有这些方法

const controller = require('../controllers/controller');

function gatewayFunction1(request, response, next) {
  // validate route
  // do other middleware stuff
  // call controller.function1
}

module.exports = {
  gatewayFunction1,
};

我为什么要这样做?我正在考虑将中间件逻辑与路由分开。该网关只应在路由之后和调用路由器之前执行。

我试图返回一个函数数组(示例代码)

function gatewayFunction1(request, response, next) {
  return [(request, response, next) => {
    console.log('called middleware 1');
    next();
  }, (request, response, next) => {
    console.log('called middleware 2');
    next();
  }, (request, response, next) => {
    response.status(200).json({
      message: 'that worked',
    });
  }];
}

但是当我调用此api路由时,我没有任何反应

  

无法得到任何回应

因此它将永远加载。有没有办法将这些中间件功能链接到另一个功能中?

2 个答案:

答案 0 :(得分:2)

您的gatewayFunction1除了返回数组外什么也不做。 只需使用router

const express = require('express');
const gatewayFunction1 = express.Router();
gatewayFunction1.use(middlewareFunction1, middlewareFunction2, controllerFunction);
module.exports = gatewayFunction1;

然后

const gatewayFunction1 = require('...');  // where you define gatewayFunction1
router.post('/', gatewayFunction1);

答案 1 :(得分:1)

中间件应该是一个函数,并且您正在返回一个数组,如果不调用下一个函数,它将陷入困境。我不喜欢将它们组合在一起的整个想法,但我认为最好的方法是将所有中间件函数导入一个函数中,然后分别调用它们,然后将该函数用作组合的中间件。