在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块)。
正确的方法是将返回的值影响为变量,如下所示:
try{
[err,resp] = await user.save();
res.send({message:"Usuario creado exitosamente.", success:true });
}
然后,您可以检查是否有错误,例如
试/接住。因为await中的promise拒绝将引发异常。
我看到了几个问题(这显然导致了您的问题):
res.send()
的两个实例更改为res.json()
。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以创建新设备?我知道我必须添加带有数据正文的标头。 问题答案: 实际上,您的代码可以像这样进行改进: 要发布信息,只需在获取调用的设置上添加方法。