【问题标题】:Node.js Mongoose, how to catch error in post saveNode.js Mongoose,如何在保存后捕获错误
【发布时间】:2016-10-05 22:39:37
【问题描述】:

我有一个包含唯一字段的集合。假设我在 pre save 方法中创建了这个唯一字段的值,如下所示:

schema.pre('save', function (next) {
    var _self = this;
    try {
        if (config.devMode) {
            log.debug('[' + si.name + ':write] - Executing presave on: ' + _self._id);
        }
        if(!_self.transaction_id){
            _self.transaction_id = powm(30).toLowerCase();
        }
        next();
    } catch (e) {
        log.error('[' + si.name + ':write] - threw an error (SAVE): ', e.stack, _self);
        next(e);
    }
});

Powm 创建一个像 'dfjkfj3434jkl23k4j2k3j4asdf' 这样的随机字符串,它需要是唯一的。虽然字符串足够长,不会被复制,但我想确定如果是,我可以用一个新的重试保存,直到它有一个真正独特的值。

我知道 MongoDB 在像这样保存文档时会抛出一个冒泡的错误:

documentname.save(function(err, doc){
   // If mongodb unique error then reset with a new id and resave
});

但这迫使我在代码中寻找发生这种情况的所有地方。所以我想知道我是否可以在 post mongoose 中间件中捕捉到这个错误。问题是似乎没有错误对象被传递给 post save 方法。那么,对此有什么想法吗?谢谢!

【问题讨论】:

    标签: node.js error-handling mongoose unique middleware


    【解决方案1】:

    我正在通过偶然发现类似问题来回答我现在发现的问题。

    我将重点关注“在保存后捕获错误”部分,因为我不确定,到目前为止,如果以这种方式修改和重新保存文档可能会或可能不会造成一些麻烦。所以我不确定这是否能满足您的特定需求,但您可以尝试一下。

    我的场景与你的相似,但略有不同:

    1. 我想为我收藏的每个文档关联一个唯一的、随机的短代码。
    2. 我不会在每次插入时随机生成它,但我预先生成了一个存储在文档中的 1M 随机代码集合,如下所示:

      {
        value: "khsda",
        status: "FREE"
      }
      
    3. 每次我想插入一个带有相关代码的新文档时,我都会执行以下操作:

      1. .pre('validate',...) 中,我选择了一个"FREE" 代码并将其状态设置为"PENDING"
      2. 我将新文档code 分配给所选代码的value
      3. 现在,如果保存过程顺利,我想将状态更改为"TAKEN",否则,我想释放代码,将其状态设置回"FREE"
      4. 要知道如果一切顺利,我挂钩了一个 .post('save',...) 中间件,它将代码 status 更改为 "TAKEN"
      5. 要知道如果出了什么问题,我会挂钩一个.post('validation',...) 中间件。但是here's the quirk:我传给中间件的函数的签名一定是function(error, doc, next)只有在验证过程中发生错误时才会调用此中间件,并让我将代码的status 放回"FREE"

    所以,基本上,你可以像这样挂钩一个中间件:

    schema.post('save', function(err, doc, next) {
        // Handle the error...
    });
    

    我不确定此时尝试更改和重新保存文档是否会导致任何问题,但从逻辑上讲,保存操作应该已经中止,在这里您可以通过next()。如果您尝试新的保存,然后调用 next() 作为参数而没有任何错误,它可能会按您的需要工作。

    让我知道这是否有效。

    【讨论】:

      猜你喜欢
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      相关资源
      最近更新 更多