给定以下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
以及其中的所有内容都会返回承诺,如果承诺被拒绝,则应由catch块捕获。还是我错过了什么,仍然应该检查响应的有效性吗?
是的,你可以安全地假定所有的错误,从await userManager.addUser(req.body)
被发现。
如果返回的许诺被价值拒绝x
,则await
关键字确保它会兑现throw x
。
但这不能确保该函数调用之外没有错误,例如您的catch
。
post()
不需要async
回调函数,因此它将忽略您隐式返回的promise。
因此,当您通过它时,请将所有内容都包裹起来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
需要异步功能的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句