【发布时间】:2018-06-10 18:27:30
【问题描述】:
我在 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();
};
如您所见,当用户未成功创建时,我正在使用 async 和 await 进行处理。但是,当创建失败时,我的 catch() 永远不会执行。为什么?有没有不同的方法来处理异步/等待的承诺拒绝?有人建议使用 thow new Error(),但我不想抛出错误,我只想向客户端发送一条消息。
更多背景信息:该应用使用 Express.js 制作,并使用 Sequelize.js 作为 ORM。我已将我的用户模型保存到 req.app.locals 中,以便我可以从我的路由处理程序访问它。实际保存到 MS SQL Server 中的数据表对 email 列有一个 UNIQUE 约束,对于使用现有电子邮件注册的用户将导致 user.save() 承诺失败。
测试时,在控制台中,我看到 sequelize.js 的异常说 UNIQUE 约束不允许创建记录。但是,我的 catch 语句没有被执行,客户端(在本例中为浏览器)一直等待响应,直到超时。如果我将 async/await 更改为使用 .then() 和 .catch() 它可以正常工作(也不需要 try/catch 块)。
【问题讨论】:
-
可能您的 User.save() 没有正确拒绝承诺。
-
“创建失败”是什么意思?
User.build会抛出异常还是什么? -
由于缺少minimal reproducible example 的问题,我投票结束,但您的标题问题将与Correct Try…Catch Syntax Using Async/Await 重复
-
@tutiplain 听起来你会想要
awaitbuild调用然后将其放在try块中而不是它之前。 -
@Bergi - 根据this doc 看起来
User.build()返回一个模型并且不是异步的。而且,user.save()似乎是异步的并且确实返回了一个承诺。除非User不是OP 认为的那样,并且在try块之前引发异常,否则不确定错误在哪里。
标签: node.js promise async-await