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 });
但这迫使我在代码中查找发生这种情况的所有位置.所以我想知道是否可以在后mongoose中间件中捕获此错误.问题是似乎没有错误对象传递给post save方法.那么,对此有何看法?谢谢!
我正在通过绊倒类似的问题回答我现在发现的问题.我将专注于“保存后保存错误”部分,因为我不确定,现在如果以这种方式修改和重新保存文档可能会或可能不会造成一些麻烦.所以我不确定这是否能满足您的特定需求,但您可以尝试一下.
我的场景与您的情况类似,但略有不同:
>我想将一个独特的,随机的短代码与我的集合中的每个文档相关联.
>我不会在每次插入时随机生成它,但是我预先生成了存储在这样的文档中的1M随机代码的集合:
{ value: "khsda", status: "FREE" }
>每次我想插入带有相关代码的新文档时,我都会执行以下操作:
>在.pre(‘validate’,…)中,我选择“FREE”代码并将其状态设置为“PENDING”.
>我将新文档代码分配给所选代码的值.
>现在,如果保存过程正常,我想将状态更改为“TAKEN”,否则,我想释放代码,将其状态设置回“FREE”.
>要知道如果一切顺利,我挂了一个.post(‘save’,…)中间件,将代码状态更改为“TAKEN”
>要知道如果出现问题,我会挂钩.post(‘validation’,…)中间件.但是here’s the quirk:我传递给中间件的函数的签名必须是函数(error,doc,next).只有在验证过程中发生错误并且让我将代码的状态恢复为“FREE”时才会调用此中间件.
所以,基本上,你可以像这样挂钩一个中间件:
schema.post('save', function(err, doc, next) { // Handle the error... });
我不确定此时是否尝试更改并重新保存文档会导致任何问题,但是通过逻辑,保存操作应该已经中止,在这里您可以通过next()控制错误的冒泡.如果您尝试新的保存然后调用next()而没有任何错误作为参数,它可能会按您的需要工作.
让我知道这个是否奏效.