gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:48:34 25 4
gpt4 key购买 nike

我有以下函数来处理 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 和 wait 进行处理。但是,当创建失败时,我的 catch() 永远不会执行。为什么?是否有不同的方法来使用 async/await 处理 promise 拒绝?有人建议使用 new Error(),但我不想抛出错误,我只想向客户端发送消息。

更多背景信息:该应用程序是使用 Express.js 制作的,并使用 Sequelize.js 作为 ORM。我已将我的用户模型保存到 req.app.locals 中,以便我可以从路由处理程序访问它。数据表实际上保存到 MS SQL Server 中,对电子邮件列有一个 UNIQUE 约束,对于使用现有电子邮件注册的用户将导致 user.save() promise 失败。

测试时,在控制台中,我看到sequelize.js 出现异常,表示 UNIQUE 约束不允许创建记录。但是,我的 catch 语句没有被执行,并且客户端(在本例中为浏览器)仍然等待响应,直到超时。如果我将 async/await 更改为使用 .then().catch() 它可以正常工作(也不需要 try/catch block )。

最佳答案

我发现了几个问题(这显然是导致您出现问题的原因):

  1. res.send() 的两个实例更改为 res.json()
  2. 删除 res.end()

如果你想发送一个对象作为响应,那么你需要发送 JSON。您可以执行 res.send(JSON.stringify(obj)) 或 Express 使用 res.json(obj) 来为您转换对象。

并且,res.end() 仅需要与 res.write() 一起使用。 res.send()res.json() 都已包含 res.end()

关于node.js - 在 Node.js 中使用 async/await 处理 promise 拒绝的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48037420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com