我正在尝试使用一系列中间件。好吧,更像是函数名和数组的组合。
而不是:
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
步。
我正在寻找一种简化中间件链接的方法,包括同名的一些中间件步骤。
答案 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)
再搜索一下^^:比以前的答案更难看,更容易理解