【问题标题】:Mongoose / Mongodb update return value and error handlingMongoose / Mongodb 更新返回值及错误处理
【发布时间】:2015-09-18 23:39:51
【问题描述】:

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

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

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

示例:一个简单的用户架构 .. 我想更新电话号码

Users 

{ 
  email : abc@abc.com,
  telephoneNumber : 123456
}

许多教程教给我的用 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
      }
 });

但是当我查看 Mongodb 文档时,我发现更新返回 WriteConcern 值,它返回类似这样的值

 {
      "ok" : 1,             // update with no err
      "nModified" :1,        // successfully update 1 user
      "n" : 1               // found 1 
 }

所以我的问题是,我是否应该这样处理我的错误,这样我就可以了解更多关于更新失败的信息...

  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
      }
 });

这是在 mongoose/mongodb 中进行更新处理的糟糕方法吗?

谢谢!! :)

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    以下是我们处理 mongoose/mongodb 错误的方法。它们可能是诸如“该值已存在”之类的错误或类似问题。

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

    if (err) {
        return res.status(400).send({
                        message: errorHandler.getErrorMessage(err,req,res)
                    });
    }
    

    它调用了在我们的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;
    

    };

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

    【讨论】:

    • 感谢您的帮助 :) 我有一些问题。因此,如果我处理这样的错误,这意味着我可以像我的帖子中的第一个示例一样处理错误吗?如果是这样,这种错误处理是否适用于每个 mongodb / mongoose 操作(例如更新、查找、保存等)?谢谢:)
    • 哦,是的,还有一件事,如果我想知道更新操作是否更新了任何文档。我还应该使用 result.nModified > 0 来检查是否有任何文档被更新?
    • 是的,您可以这样做,以确保更新发生。
    猜你喜欢
    • 2018-04-02
    • 2013-02-07
    • 2021-08-29
    • 2012-08-05
    • 2014-01-07
    • 2021-09-10
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多