在Node.jsV8.9中,我有以下函数来处理用户注册:
module.exports = async (req,res) =>{
const User = req.app.locals.User;
const user =User.build({
email: req.body.email,
displayName: req.body.display_name,
realName: req.body.real_name,
hashedPassword:req.body.password ,
role: 0
});
try{
await user.save();
res.send({message:"Usuario creado exitosamente.", success:true });
}
catch(ex)
{
res.send({message:"Información es inválida:", success:false});
}
res.end();
};
正如您所看到的,我正在使用异步,并等待在用户未成功创建时进行处理。但是,当创建失败时,我的catch()从不执行。为什么?使用Async/Await是否有不同的方法来处理承诺拒绝?有人建议使用thow new Error(),但我不想抛出一个错误,我只想向客户机发回一个消息。
更多背景信息:应用程序是用Express.js制作的,并使用Sequelize.js作为ORM。我已经将我的用户模型保存到req.app.locals中,这样我就可以从路由处理程序访问它了。实际上保存到MS SQL Server中的datatable对email列有一个唯一的约束,用户注册一个已经存在的电子邮件会导致User.save()promise失败。
测试时,在控制台中,我看到来自sequelize.js的异常,表示唯一约束不允许创建记录。但是,我的catch语句没有被执行,客户端(在本例中是浏览器)仍然在等待响应,直到它超时为止。如果更改async/await以使用.then()
和.catch()
,它可以正常工作(也不需要try/catch块)。
我看到了几个问题(这显然导致了您的问题):
res.send()
的两个实例更改为res.json()
。res.end()
。如果您希望发送一个对象作为响应,那么您需要发送JSON。您可以执行res.send(json.stringify(obj))
或Express havesres.json(obj)
来为您转换对象。
并且,只有res.write()
才需要res.end()
。res.send()
和res.json()
都已包含res.end()
。
试/接住。因为await中的promise拒绝将引发异常。
正确的方法是将返回的值影响为变量,如下所示:
try{
[err,resp] = await user.save();
res.send({message:"Usuario creado exitosamente.", success:true });
}
然后,您可以检查是否有错误,例如