如何在更新文档时发现mongoose错误?

问题描述 投票:0回答:1

在我的Node.js后台,我有一个端点,在那里更新用户配置文件信息。如果新邮件已经在数据库中,我想给用户发送一个错误的响应。然而,虽然我已经设置了一个 try-catch 的地方,但我还是无法捕捉到这个错误。相反,服务器只是以下面的mongoose错误信息崩溃。我在前端收到了一个错误响应,但是距离错误发生的时间已经过了很久。所有有用的建议都非常感激。

(node:11864) UnhandledPromiseRejectionWarning: MongoError.E11000重复键错误收集。E11000重复密钥错误集合:widubima.usersindex: email_1 dup key: { : "[email protected]" } ... (node:11864) UnhandledPromiseRejectionWarning。未处理的承诺拒绝。这个错误源于在没有 catch 块的异步函数内部抛出,或者拒绝一个没有用 .catch() 处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用 CLI 标志。--unhandled-rejections=strict (见 https:/nodejs.orgapicli.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)
  }
}
node.js mongoose try-catch response
1个回答
1
投票

try...catch可以和asyncawait一起使用,而不能和promise...then一起使用,promise...then有一个特殊的块,叫做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)
    })
}

如果你想使用asyncawait,那么。

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.infopromise-error-handling。

© www.soinside.com 2019 - 2024. All rights reserved.