javascript - 使用深层嵌套的异步函数进行错误处理

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

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

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 而不是在 Controller 级别抛出另一个 newError ,但我需要做什么?如果我抛出另一个错误,那么堆栈跟踪不是 Error: error: error ... 吗?这对我来说似乎不对。

最佳答案

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

  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

关于javascript - 使用深层嵌套的异步函数进行错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57844527/

相关文章:

jquery - CodeIgniter-jQuery;显示/隐藏错误类别

javascript - React Router : What's the purpose of Browser History? 浏览器历史记录是强制性的吗?

c++ - V8,将文本 append 到数组的最后一个元素

node.js递归写入文件目录

当抛出错误时,R 以不可见的方式返回对象和正常错误

c# - 错误: Unable to cast object of type 'System.Int32' to type 'System.String'

javascript - 为了更好地进行单元测试,静态类型 javascript 的示例是什么?

javascript - 谷歌地图问题 map 上没有显示标记

javascript - WinJS xhr可以发出HTTPS请求吗?

javascript - SyntaxError : Cannot use import statment without a module, 类型错误 [ERR_UNKNOWN_FILE_EXTENSION]:Catch 22