猫鼬虚拟现场

问题描述:

我创建的模式用户是这样的:猫鼬虚拟现场

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)

这是因为猫鼬并不适用任何一个findByIdAndUpdate()操作下面的:

  • 默认
  • 制定者
  • 验证
  • 中间件

docs

如果需要这些功能,使用的第一 检索文档的传统做法。

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

与版本4.0.9+中间件支持findByIdAndUpdate()

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