如何在express中的单个路由处理程序中处理来自多个独立promise的错误?

时间:2017-04-21 09:24:47

标签: node.js express error-handling middleware

我有一个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)的第二次调用最终没有任何结果,中间件也没有处理任何事情。

我正在寻找有关以下几项的建议:

  1. 以某种方式按顺序调用多个promises?
  2. 如果是,我该如何处理错误?
  3. 如果不是,在这种情况下什么是好的设计模式?
  4. tldr 我必须在一条快速路线中运行多个独立功能,而且我不知道如何处理可能的错误

2 个答案:

答案 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()通过更多中间件提取这些错误。