【问题标题】:Error handling with deeply nested async functions使用深度嵌套的异步函数处理错误
【发布时间】:2020-01-10 15:51:36
【问题描述】:

当函数嵌套三层时,我遇到了捕获错误的问题。这是一个具有异步功能的路由器:

router.post('/',
  validatevalues,
  async (req, res) => {
    // if values are invalid then
    // return res.status(422).send(errors.msg);

    const result = await userController.post(req.body);
    return res.status(201).send('Success');
  },
);

const userController = {
    async post(req) {
        try {
            await bcrypt.genSalt()
            await bcrypt.hash();
            await db.query(req.somevalues);
        }  catch (err) {
            console.error(err);
        };
    };
};
const query = {
    return new Promise(function(resolve, reject) {
      ...
      if (err) {
        reject(new Error(err));
      } else {
        resolve(res);
      };
    };
};

console.error(err) 正在打印此堆栈跟踪

Error: error: duplicate key value violates unique constraint...

然后我通过 Mocha 测试在路由器级别得到 Uncaught AssertionError

Uncaught AssertionError: expected { Object (_events, _eventsCount, ...) } to have status code 422 but got 201

这似乎是意料之中的,因为我只是 console.error 而不是在控制器级别抛出另一个 newError,但我需要做什么?如果我抛出另一个错误,那么堆栈跟踪不会是Error: error: error ... 吗?这对我来说似乎不对。

【问题讨论】:

  • 您根本无法捕获控制器中的错误。在您的路由器中捕获它,它可以通过发送正确的 (422) 响应来处理它。

标签: javascript node.js error-handling promise async-await


【解决方案1】:

你应该只在最高级别捕捉:

  router.post('/', validatevalues, async (req, res) => {
    try {
      const result = await userController.post(req.body);
      return res.status(201).send('Success');      
    } catch(error) {
      res.status(402).send(error.message);
    }
 });

如果还想在较低级别登录,可以重新抛出错误:

    }  catch (err) {
        console.error(err);
        throw err;
    } // no semicolon here, its unneccessary

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 2020-05-11
    • 1970-01-01
    • 2018-04-02
    • 2014-05-02
    • 2012-10-12
    • 2017-10-19
    相关资源
    最近更新 更多