提问者:小点点

在node.js中使用async/await处理promise拒绝的正确方法是什么?


在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块)。


共3个答案

匿名用户

我看到了几个问题(这显然导致了您的问题):

  1. res.send()的两个实例更改为res.json()
  2. 删除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 });
}

然后,您可以检查是否有错误,例如