猫鼬/ Mongodb更新返回值和错误处理

pup*_*pup 5 mongoose mongodb node.js express

我对Mongoldb更新的返回值以及如何处理错误感到困惑。

我正在使用Node.js,Express.js和Mongoose.js作为我的Mongodb驱动程序

当我浏览许多教程时,看到的错误处理的唯一方法是...

示例:一个简单的用户架构..,我想更新phoneNumber

Users 

{ 
  email : abc@abc.com,
  telephoneNumber : 123456
}
Run Code Online (Sandbox Code Playgroud)

许多教程教会我的用node.js编写的错误处理示例

 Users.update({email: abc@abc.com}, {'$set': {telephoneNumber : 654321}, function(err, result){
      if(err){
           //err
      }else if(!result){
           //update not success
      }else{
           //update success
      }
 });
Run Code Online (Sandbox Code Playgroud)

但是当我查看Mongodb文档时,我发现该更新返回WriteConcern值,该值返回类似以下内容的值

 {
      "ok" : 1,             // update with no err
      "nModified" :1,        // successfully update 1 user
      "n" : 1               // found 1 
 }
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,我应该这样处理我的错误,以便我更多地了解更新失败...

  Users.update({email: abc@abc.com}, {'$set': {telephoneNumber : 654321}, function(err, result){
      if(err || result.ok === 0){
           //err
      }else if(result.nModified === 0){
           //update fail
      }else if(result.n === 0){
           //could not be found 
      }else{
           //update success
      }
 });
Run Code Online (Sandbox Code Playgroud)

这是在mongoose / mongodb中更新处理的不好方法吗?

谢谢!!:)

小智 5

这是我们如何处理 mongoose/mongodb 错误。它们可能是“那个值已经存在”之类的错误或类似的问题。

首先在 mongoose 调用的错误块中添加:

if (err) {
    return res.status(400).send({
                    message: errorHandler.getErrorMessage(err,req,res)
                });
}
Run Code Online (Sandbox Code Playgroud)

它调用在我们的 errorHandler 文件中定义的“getErrorMessage”函数,该函数可能调用唯一的错误消息函数。我们还将 mongo 数据库中的错误记录在一个单独的集合下。

exports.getErrorMessage = function(err,req,res) {
    var message = '';
    if (err.code) {
        switch (err.code) {
            case 11000:
            case 11001:
                message = getUniqueErrorMessage(err);
                break;
            default:
                message = 'Something went wrong. We have logged this issue and will correct';
        }
    } else {
        for (var errName in err.errors) {
            if (err.errors[errName].message) message = err.errors[errName].message;
        }
    }
    //log the error to Mongo
    ErrorLog.create(err,req,res);
    return message;
};

var getUniqueErrorMessage = function(err) {
var output;

try {
    var fieldName = err.err.substring(err.err.lastIndexOf('.$') + 2, err.err.lastIndexOf('_1'));
    output = fieldName.charAt(0).toUpperCase() + fieldName.slice(1) + ' already exists';

} catch (ex) {
    output = 'Unique field already exists';
}
return output;
Run Code Online (Sandbox Code Playgroud)

};

希望有帮助,如果我能澄清任何事情,请告诉我。