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