【发布时间】:2016-07-04 11:15:40
【问题描述】:
我想在 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 之前解决promise?如何更正此问题以获得所需的结果?
【问题讨论】:
-
then(next())应该是then(next)。 -
如果你想走承诺路线,你应该让你的中间件返回承诺。如果由于某种原因你仍然需要回调,你不能只是传递
resolve,因为失败与承诺不同。请参阅 here 如何正确地从节点样式回调中获取承诺。