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

时间:2017-12-30 20:01:40

标签: node.js promise async-await

我有以下函数来处理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块)。

3 个答案:

答案 0 :(得分:0)

尝试/捕获。因为等待中的承诺拒绝将引发异常。

答案 1 :(得分:0)

我发现了一些问题(显然导致了问题):

  1. res.send()的两个实例更改为res.json()
  2. 删除res.end()
  3. 如果要将对象作为响应发送,则需要发送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 });
}

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

的错误