更新文档时如何捕获猫鼬错误

时间:2020-05-15 07:55:40

标签: node.js mongoose try-catch response

在我的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)
  }
}

1 个答案:

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