我想使用 mongoose 中间件 Hook 重新尝试保存文档,以防初始保存因重复键错误而失败。用例如下:
我的模型使用自动生成的 slug 进行识别。例如。 item
, item-2
, item-3
, …, item-n
.如果 item
已经存在,则应向 slug 添加一个计数器。我无法提前检查“下一个”slug,因为我需要在任何情况下避免冲突。
由于这个逻辑会涉及到几个不同的模型,所以我想把它隔离成一个mongoose插件。
这个想法是否可行?例如。 schema.post('save', handler)
仅在成功保存时执行。还有其他我可以利用的钩子(Hook)吗?
最佳答案
我正在使用预保存 Hook 来检查 slug 是否已经存在并使用以下代码,到目前为止它似乎工作得很好。
pageSchema.pre('save', function(next){
var page = this;
page.createdDT = new Date();
page.updatedDT = new Date();
page.slug = page.title.slug(); // create slug from title
var re = new RegExp(page.slug, 'i');
mongoose.models["page"].find({slug: { $regex: re}}, function(err, pages){
// slug doesn't exist, good to go
if(!err && !pages) return next();
var slugs = [];
// let's get all slugs
pages.forEach(function(page){
slugs.push(page.slug);
});
// keep increasing `i` until slug is unique
// set i to 1 to avoid hello-0
var i = 1;
var tempSlug = page.slug;
while(slugs.indexOf(tempSlug) >= 0){
tempSlug = page.slug + '-' + i;
i++;
}
//unique slug for example "hello-2"
page.slug = tempSlug;
next();
});
});
关于node.js - 使用 mongoose hook 重试保存重复键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33920653/