【发布时间】: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