当前位置: 首页 > 知识库问答 >
问题:

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

姜弘化
2023-03-14

在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个答案

冯卜鹰
2023-03-14

正确的方法是将返回的值影响为变量,如下所示:

try{
        [err,resp] = await user.save();
        res.send({message:"Usuario creado exitosamente.", success:true });
}

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

西门飞星
2023-03-14

试/接住。因为await中的promise拒绝将引发异常

满博
2023-03-14

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

  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()

 类似资料:
  • 为了学习角度2,我正在尝试他们的教程。 我得到这样的错误: 我在SO中浏览了不同的问题和答案,但没有发现什么是“未处理的promise拒绝”。 有人能简单地解释一下它是什么,以及<code>错误:生成cmd ENOENT</code>是什么,当它出现时,我需要检查什么才能消除这个警告吗?

  • 我读到过,在中包含异步是async/await的反模式。下面的代码可以工作,但是我想知道如果没有中的,如何实现相同的结果。 谢了。

  • 我得到这个错误- (节点:18420)未处理的PromisejectionWarning:TypeError:无法读取未定义的属性“name” (节点:18420)未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终止节点进程,请

  • 我想在Repl上为我的游戏实现一个基本的排行榜。它,所以我创建了一个节点。js后端。这是我在后端的配置: 但是每当我尝试发布时,我都会得到以下错误: (节点:344)未处理的PromisejectionWarning:TypeError:无法读取null的属性“push” (节点:344)UnhandledPromiseRejtionWarning:未处理的promise拒绝。这个错误要么是由于抛

  • 我有以下验证函数检查用户是否存在: 以下使用Chai的测试应对此进行测试: 错误确实会被抛出,但是mocha在控制台中显示以下内容: 2)显示抛出,如果用户是未定义的(节点: 18587)UnhandledPromiseRejse警告:未处理的promise拒绝(拒绝id: 2):错误:用户不存在 所以我的问题是,我如何重写测试,让它捕捉到promise拒绝?

  • 问题内容: 我正在做一个需要我向API发出请求的项目。用Async / Await发出POST请求的正确形式是什么? 作为示例,这是我获取所有设备列表的信息。我将如何将此请求更改为POST以创建新设备?我知道我必须添加带有数据正文的标头。 问题答案: 实际上,您的代码可以像这样进行改进: 要发布信息,只需在获取调用的设置上添加方法。