使用mongoose .pre更新slug(' save')

时间:2017-09-03 03:11:19

标签: node.js mongoose

所以我到处搜寻,我不能因为爱我而弄清楚出了什么问题!我正在开发一个需要博客帖子的网页应用程序,并且slug直接与文章的名称相关联(包括一些正则表达式)。但是当更新帖子时,除了slug之外一切都会发生变化!所以url params仍然显示旧的slug而不是新的slug。有什么想法吗?

 const articleSchema = new mongoose.Schema({
    name:{
        type: String,
        trim: true,
        required: 'Please enter an article name'
        },
    slug: String,
    description:{
        type: String,
        trim: true,
        required: 'Please enter an description'
    },
    content:{
        type: String,
        trim: true,
        required: 'Please enter article content'
        },
    tags: [String],
    created:{
        type: Date,
        default: Date.now
    },
    photo: String
})


articleSchema.pre('save', async function(next){
    try{
        if(!this.isModified('name')){
            next()
            return;
        }

       this.slug = slug(this.name)

    const slugRegEx = new RegExp(`^(${this.slug})((-[0-9]*$)?)$`,'i')

    const articlesWithSlug = await this.constructor.find({slug: 
slugRegEx})

    if(articlesWithSlug.length){
      this.slug = `${this.slug}-${articlesWithSlug.length + 1}`
 }
  next()
    }catch(error){
        throw error
    }
})

2 个答案:

答案 0 :(得分:0)

在Mongoose中使用更新方法时,例如 Model.findByIdAndUpdate(),不会触发预保存挂钩。

如果您需要触发预保存挂钩,则必须调用保存方法。

例如:

[^[:space:]]

答案 1 :(得分:0)

根据要使用的操作,您需要updateupdateOneupdateManyfindOneAndUpdate中的一个预钩。

但是this不会像在预保存中那样指向该挂钩中的文档,您将需要修改更新查询。

您可以通过this.getUpdate()

获取查询对象

由于所有更新操作的挂钩都类似,因此您可以注册一个函数来处理所有这些挂钩。 这是example how I did it