我有一个Express路由处理程序,需要异步启动多个操作。这些操作是独立的,不会相互干扰。 我试图用Promises做到这一点,但是当我必须处理来自Promises的错误时我遇到了问题。
让我用一个例子来解释。
router.post('/data', function (req, res, next) {
// do something before anything else
next();
}, function (req, res, next) {
promise1(req.params)
.then((data) => {
// do something with data
}).catch((err) => {
next(err);
});
promise2(req.params)
.then((data) => {
// do something with data
}).catch((err) => {
next(err);
});
}, function (err, req, res, next) {
// error middleware
});
问题在于,如果两个承诺都会导致错误,它们最终都会在中间件中调用next(err),并且这里存在问题。
对next(err)的第二次调用最终没有任何结果,中间件也没有处理任何事情。
我正在寻找有关以下几项的建议:
tldr 我必须在一条快速路线中运行多个独立功能,而且我不知道如何处理可能的错误
答案 0 :(得分:0)
您可以像这样使用Promise.all
:
Promise.all([promise1(req.params), promise2(req.params)])
.then(results => {
// both succeeded
// do something with results[0] and results[1]
}).catch(err => {
// some error happend
next(err);
});
参见文档:
有关更多示例,另请参阅other answers about Promise.all
。
答案 1 :(得分:0)
除了Promise.all
使用rsp
已经回答之外。
我还建议在catch块中处理错误响应,例如
.catch(error => {
res.status(500).end("An error occured: " + error);
});
而不是通过next()
通过更多中间件提取这些错误。