2017-09-03 50 views
1

所以我到處搜索,我不能爲我的愛找出什麼是錯的!我正在研究一個需要博客文章和slu web的web應用程序直接與文章的名稱(包括一些正則表達式)相關聯。但是,當更新發布一切變化除了slu!!所以url參數仍然顯示舊的slu instead,而不是新的。有什麼想法嗎?更新slu。.pre('保存')

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 
    } 
}) 
+1

你錯過了一個重要的細節。你如何更新?用示例代碼編輯您的問題。在'pre'中間件中添加'console.log()'語句,看看它在更新時是否被調用。 – Mikey

回答

0

當使用貓鼬更新方法,例如Model.findByIdAndUpdate(),預保存鉤未燒製。

如果您需要啓用預存儲鉤子,則必須調用保存方法。

例如:

MyModel.findById(id, function(err, doc) { 
    doc.name = 'new name'; 
    doc.save(function(err, doc) { 
     // ... 
    }); 
});