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