我有以下函数来处理node.js v8.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处理承诺拒绝是否有不同的方法?有人建议使用新的Error(),但我不想抛出错误,我只想将消息发送回客户端。
更多背景信息:应用程序使用Express.js制作,并使用Sequelize.js作为ORM。我已将我的用户模型保存到req.app.locals中,以便我可以从路由处理程序访问它。实际保存到MS SQL Server中的数据表在电子邮件列上具有UNIQUE约束,对于使用现有电子邮件注册的用户将导致user.save()承诺失败。
在测试时,在控制台中,我看到sequelize.js中的异常,说UNIQUE约束不允许创建记录。但是,我的catch语句没有被执行,客户端(在这种情况下是浏览器)仍在等待响应,直到它超时。如果我更改async / await以使用.then()
和.catch()
它可以正常工作(也不需要try / catch块)。
答案 0 :(得分:0)
尝试/捕获。因为等待中的承诺拒绝将引发异常。
答案 1 :(得分:0)
我发现了一些问题(显然导致了问题):
res.send()
的两个实例更改为res.json()
。res.end()
。如果要将对象作为响应发送,则需要发送JSON。您可以res.send(JSON.stringify(obj))
或Express res.json(obj)
为您转换对象。
并且res.end()
只需要res.write()
。 res.send()
和res.json()
都已包含res.end()
。
答案 2 :(得分:-3)
正确的方法是将返回值影响到变量:
try{
[err,resp] = await user.save();
res.send({message:"Usuario creado exitosamente.", success:true });
}
然后,您可以检查是否有例如
的错误