2015-04-05 71 views
2

我創建的模式用戶是這樣的:貓鼬虛擬現場

var schema = new Schema({ 
    username: { 
     type: String, 
     unique: true, 
     required: true 
    }, 
    hashedPassword: { 
     type: String, 
     required: true 
    }, 
    salt: { 
     type: String, 
     required: true 
    } 
}); 

schema.virtual('password') 
    .set(function(password) { 
     this._plainPassword = password; 
     this.salt = Math.random() + ''; 
     this.hashedPassword = this.encryptPassword(password); 
    }) 
    .get(function() { return this._plainPassword; }); 

schema.methods.encryptPassword = function(password) { 
    return crypto.createHmac('sha1', this.salt).update(password).digest('hex'); 
}; 

然後我想用這兩種方法來更改密碼:

  1. 工作不錯

    user.findById('userId ..',function(err,user){user.password ='456'; user.save(cb); })

  2. 爲什麼這種方法不起作用?

    User.findByIdAndUpdate( '用戶id',{$組:{密碼: '456'}},CB)

回答

5

這是因爲貓鼬並不適用任何一個findByIdAndUpdate()操作下面的:

  • 默認
  • 制定者
  • 驗證
  • 中間件

docs

如果需要這些功能,使用的第一 檢索文檔的傳統做法。

Model.findById(id, function (err, doc) { 
    if (err) .. 
    doc.name = 'jason borne'; 
    doc.save(callback); 
}) 
0

與版本4.0.9+中間件支持findByIdAndUpdate()

CustomerSchema.pre('findOneAndUpdate', function(next, done) { 
    console.log("findOneAndUpdate pre middleware!!!"); 
    next(); 
});