我想使用mongoose中间件钩子重新尝试保存文档,以防初始保存失败并出现重复键错误.用例如下: 我的模型使用slugs进行识别,这是自动生成的.例如. item,item-2,item-3,…,item-n.如果项目已经存
我的模型使用slugs进行识别,这是自动生成的.例如. item,item-2,item-3,…,item-n.如果项目已经存在,则应该向slug添加一个计数器.我不能提前检查“下一个”slu ,,因为我需要在任何情况下避免冲突.
由于这个逻辑将涉及几个不同的模型,我想将它分离成一个mongoose插件.
这个想法是否可能?例如. schema.post(‘save’,handler)仅在成功保存时执行.还有其他钩子,我可以利用吗?
我正在使用预保存挂钩检查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(); }); });