所以我到处搜寻,我不能因为爱我而弄清楚出了什么问题!我正在开发一个需要博客帖子的网页应用程序,并且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
}
})
答案 0 :(得分:0)
在Mongoose中使用更新方法时,例如 Model.findByIdAndUpdate(),不会触发预保存挂钩。
如果您需要触发预保存挂钩,则必须调用保存方法。
例如:
[^[:space:]]
答案 1 :(得分:0)
根据要使用的操作,您需要update
,updateOne
,updateMany
或findOneAndUpdate
中的一个预钩。
但是this
不会像在预保存中那样指向该挂钩中的文档,您将需要修改更新查询。
您可以通过this.getUpdate()
由于所有更新操作的挂钩都类似,因此您可以注册一个函数来处理所有这些挂钩。 这是example how I did it