在express.js中使用一组中间件

时间:2017-03-17 13:38:01

标签: javascript node.js express

我正在尝试使用一系列中间件。好吧,更像是函数名和数组的组合。

而不是:

router.post('/editPassword', validate, changePassword, sendConfirmation);

我希望有类似的东西:

router.post('/editPassword', validate, [changePassword, sendConfirmation] ); 

这看起来像是:

router.post('/editPassword', validate, doAction ); 

doAction将是这样的数组:

var doAction = [
   //equivalent of changePassword
   function(req, res, next){
      //whatever
      next();
   },

   //equivalent to the previous sendConfirmation
   function(req, res, next){
      //whatever
   }
]

但它似乎失败并返回到validate中第一个函数中next()之后的doAction步。

我正在寻找一种简化中间件链接的方法,包括同名的一些中间件步骤。

3 个答案:

答案 0 :(得分:2)

我认为你希望它看起来那样的原因不仅是因为它看起来很容易,而且能够重用其他中间件。在这种情况下,您可以创建一个运行所有其他中间件的中间件来为您进行检查,并且只有在所有验证成功时才调用下一个函数。

var express = require('express');
var app = express();

function middleware1(req, res, next) {
    if(req.query.num >= 1) {
        next();
    } else {
        res.json({message: "failed validation 1"});
    }
}

function middleware2(req, res, next) {
    if(req.query.num >= 2) {
        next();
    } else {
        res.json({message: "failed validation 2"});
    }
}

function middleware3(req, res, next) {
    if(req.query.num >= 3) {
        next();
    } else {
        res.json({message: "failed validation 3"});
    }
}

function combination(req, res, next) {
    middleware1(req, res, function () {
        middleware2(req, res, function () {
            middleware3(req, res, function () {
                next();
            })
        })
    })
}


app.get('/', combination, function (req, res) {
  res.send('Passed All Validation!');
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

您可以通过运行该应用,然后查看http://localhost:3000/?num=3,将值3更改为较低的数字或删除num参数来测试此应用。

我不确定这是否是正确的方法,但这就是我处理其他项目的方式。让我知道你的想法。

注意:查看用例评论。 @robertklep可能有更好的解决方案,具体取决于您希望如何使用中间件

答案 1 :(得分:2)

请注意,您在validate中间件中没有这样做(相当于):

function middleware(req, res, next) {
  if (someCondition) {
    console.log('some condition is true');
    next();
  }
  console.log('some condition is false');
  res.status(400).end();
}

这里的意图是在调用next之后,其余代码不会执行,但它会执行。关于next没有什么特别的,所以当你调用它时,它返回之后中间件代码继续运行(导致“某些条件为真”“某些条件是false“要记录。”

这就是为什么你经常看到这个:

  if (someCondition) {
    console.log('some condition is true');
    return next();
    // Or, alternatively:
    // next();
    // return;
  }

return导致中间件函数在调用next后返回,因此函数中的其余代码将不会被执行。

答案 2 :(得分:1)

再搜索一下^^:比以前的答案更难看,更容易理解

https://github.com/blakeembrey/compose-middleware