给出以下Node.js快速路由:
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;
我可以安全地假设,如果catch块中的代码没有运行,那么没有错误?由于userManager.addUser
及其内部的所有内容都会返回promise,如果被拒绝,则应该由catch块捕获。
或者我是否遗漏了某些内容,是否仍应检查有效性的响应?
答案 0 :(得分:0)
是的,您可以安全地假设发现await userManager.addUser(req.body)
中的所有错误。
如果返回的承诺被拒绝且值为x
,则await
关键字会确保它throw x
。
但这并不能确保函数调用之外没有错误,例如catch
。
post()
不期望async
回调函数,因此它会忽略您隐式返回的承诺。
因此当你传递一个时,将try
/ catch
包裹在所有内容中,因为没有人可以传递给它:
router.route('/user').post(async function(req, res) {
try {
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'});
}
} catch (err) {
logger.error('POST /user fatal error: '+err);
}
})
通过这种方式,所有编程错误都会被捕获,并且永远不会被静音或作为未处理的拒绝。
或者更好的是,如果它是一个选项,请写一个需要异步函数的post
。