我在Node.js express app中有以下代码:
router.route('/user')
.post(async function(req, res) {
if(req.body.password === req.body.passwordConfirm) {
try {
var response = await userManager.addUser(req.body);
res.status(201).send();
} catch(err) {
logger.error('POST /user failed with error: '+err);
res.status(500).send({err:"something went wrong.."});
}
} else {
res.status(400).send({err:'passwords do not match'});
}
})
和userManager:
var userManager = function() {
this.addUser = async function(userobject) {
userobject.password_hash = await genHash(userobject.password_hash);
var user = new User(userobject);
return await user.save();
};
};
module.exports = userManager;
我的问题是:路由中的try catch块会捕获 addUser 中引发的所有错误,还是只捕获 user.save(),因为那是返回的那个?
答案 0 :(得分:7)
答案是肯定的,它将捕获try
块内和所有内部函数调用中的所有错误。
async/await
只是承诺的语法糖。因此,如果使用promises可以实现某些功能,那么也可以使用async/await
。
例如,以下两个代码段都是等效的:
使用承诺:
function bar() {
return Promise.reject(new Error('Uh oh!'));
}
function foo() {
return bar();
}
function main() {
return foo().catch(e => {
console.error(`Something went wrong: ${e.message}`);
});
}
main();

使用async/await
:
async function bar() {
throw new Error('Uh oh!');
}
async function foo() {
await bar();
}
async function main() {
try {
await foo();
}
catch(e) {
console.error(`Something went wrong: ${e.message}`);
}
}
main();

事实上,由于您未在await
上使用userManager.addUser
,因此您的代码无效。
它还会强制您在父函数上使用async
,这可能会破坏它。检查快速文档(或者只是尝试它是否有效)。
router.route('/user')
.post(async function(req, res) {
if(req.body.password === req.body.passwordConfirm) {
try {
var response = await userManager.addUser(req.body);
res.status(201).send();
} catch(err) {
logger.error('POST /user failed with error: '+err);
res.status(500).send({err:"something went wrong.."});
}
} else {
res.status(400).send({err:'passwords do not match'});
}
})