mongoose虚拟字段没有更新
我为这样的用户创build了一个架构:
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'); };
那么我试图改变密码使用两种方法:
-
工作很好
User.findById('userId ..',function(err,user){user.password ='456'; user.save(cb);})
-
为什么这种方法不起作用?
User.findByIdAndUpdate('userId',{$ set:{password:'456'}},cb)
发生这种情况是因为Mongoose在findByIdAndUpdate()
操作中不应用以下任何操作:
- 默认
- 制定者
- validation
- 中间件
从文档 :
如果您需要这些function,请使用传统方法首先检索文档。
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(); });