我想在express中组合中间件以使它们并行,而不是顺序如果你放入app.use(path, /* middlewares *,/ callback)
。
我写了以下函数:
function makeParallelMiddleware(args) {
let makePromises = (req, res) => args.map((func) => {
return new Promise((resolve, reject) => {
console.log('In promise: ' + func.name);
func(req, res, resolve);
})
});
return (req, res, next) => Promise.all(makePromises(req, res)).then(next())
}
但这似乎不能正常工作。我使用以下两个中间件进行测试:
function middlewareA(req, res, next) {
req.A = 1;
console.log('I am in A');
setTimeout(() => {
console.log('I am in A delay');
if (req.C) {
req.C = 'BA'
} else {
req.C = 'A'
}
next()
}, 1000)
}
function middlewareB(req, res, next) {
req.B = 1;
if (req.C) {
req.C = 'AB'
} else {
req.C = 'B'
}
next()
}
app.get('/parallel', makeParallelMiddleware([middlewareA, middlewareB]) ,(req, res) => {
res.send(req.C);
});
当我访问/parallel
时,我只能获得“B”而不是“BA”。
如果在req.C
设置之前解决了承诺怎么可能?如何更正此项以获得所需结果?
答案 0 :(得分:1)
改变这个:
return (req, res, next) => Promise.all(makePromises(req, res)).then(next())
// remove parens here ^^
到此:
return (req, res, next) => Promise.all(makePromises(req, res)).then(function(results) {
next();
});
您正在立即调用next()
,而不是传递稍后可以通过.then()
方法调用的函数引用。另外,next()
可能不喜欢传递给它的数组,这是.then()
在你的情况下会传递的数据,所以最好只包装一个自定义函数并调用plain {{ 1}}。
而且,如果你的任何一个承诺拒绝他们抛出异常,你还需要一些错误处理。