在我的Node.js后端中,我有一个用于更新用户配置文件信息的终结点。如果新电子邮件已经在数据库中,我想向用户发送错误响应。但是,尽管我已经设置了try-catch
,但是仍然无法捕获错误。相反,服务器只是崩溃并显示以下猫鼬错误消息。我在前端收到了错误响应,但是从发生错误开始经过了很长时间。我们非常感谢所有有用的建议。
(节点:11864)UnhandledPromiseRejection警告:MongoError:E11000 重复键错误集合:testing.users索引:email_1重复键: {:“ test@gmail.com”} ...(节点:11864) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个 由抛出异步函数引起的错误 没有障碍,或者拒绝没有处理的承诺 使用.catch()。根据未处理的诺言终止节点进程 拒绝,请使用CLI标志
--unhandled-rejections=strict
(请参见 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝ID:1)
UpdateProfile
在UserController.js中
updateProfile: (id,fname,lname,email,mobile,address,next) => {
let args = {fname,lname,email,mobile,address}
try{
User.findOneAndUpdate({ "_id": id },
{ "$set": Utils.removeNullsFromObject(args)},
{new: true, useFindAndModify: false}).then(function(updatedUser, err){
if(err) {
console.log(err);
next(err,null)
} else {
next(null,updatedUser)
}
);
}
catch(err){
console.log(err);
next(err,null)
}
}
答案 0 :(得分:1)
Try ... catch将与async / await一起工作,而不与诺言一起工作...然后。承诺...然后有一个称为catch的特殊块,可以用作
updateProfile: (id,fname,lname,email,mobile,address,next) => {
let args = {fname,lname,email,mobile,address}
User.findOneAndUpdate({ "_id": id },
{ "$set": Utils.removeNullsFromObject(args)},
{
new: true, useFindAndModify: false
}).then(updatedUser => {
next(null,updatedUser)
).catch(err =>{
console.log(err);
next(err,null)
})
}
如果您要使用异步/等待,则
updateProfile: async (id,fname,lname,email,mobile,address,next) => {
let args = {fname,lname,email,mobile,address}
try{
const updatedUser = await User.findOneAndUpdate({ "_id": id },
{ "$set": Utils.removeNullsFromObject(args)},
{
new: true, useFindAndModify: false
})
next(null,updatedUser)
} catch(err) {
console.log(err);
next(err,null)
})
}
有关更多详细信息,请参阅https://javascript.info/promise-error-handling