【问题标题】:How to handle errors from multiple independent promises inside a single route handler in express?如何在快递的单个路由处理程序中处理来自多个独立承诺的错误?
【发布时间】:2017-04-21 09:24:46
【问题描述】:

我有一个 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
});

问题是如果两个promise都发生错误,他们最终都会在中间件中调用next(err),这里就有问题了。

对 next(err) 的第二次调用没有结果,中间件也不处理任何事情。

我正在寻找关于几件事的建议:

  1. 按顺序调用多个 Promise 是否是一种好的设计?
  2. 如果是,我应该如何处理错误?
  3. 如果不是,在这种情况下什么是好的设计模式?

tldr我必须在一个快速路由中运行多个独立的函数,我不知道如何处理可能的错误

【问题讨论】:

    标签: node.js express error-handling middleware


    【解决方案1】:

    你可以像这样使用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

    【讨论】:

    • 但是,如果两个承诺都发生错误,这会给我带来问题。第一个错误被正确转发到中间件,但第二个在 promise 中的 reject(err) 调用上给了我一个未处理的错误。
    【解决方案2】:

    除了使用Promise.all 作为rsp 已经回答。 我还建议在 catch 块中处理错误响应,例如

    .catch(error => {
      res.status(500).end("An error occured: " + error);
    });
    

    而不是通过更多的中间件通过next() 拉出这些错误。

    【讨论】:

    • 但是,如果我想将错误处理集中在错误函数中,这样我就可以对每种错误应用一系列操作?例如,日志记录
    猜你喜欢
    • 2018-11-07
    • 2018-02-19
    • 1970-01-01
    • 2021-09-22
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多