我为这样的用户创建了一个模式:
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)
答案 0 :(得分:5)
这是因为Mongoose在findByIdAndUpdate()
操作中不应用以下任何内容:
来自docs:
如果您需要这些功能,请先使用传统方法 检索文档。
Model.findById(id, function (err, doc) { if (err) .. doc.name = 'jason borne'; doc.save(callback); })
答案 1 :(得分:0)
版本4.0.9+中间件支持findByIdAndUpdate()
。
CustomerSchema.pre('findOneAndUpdate', function(next, done) {
console.log("findOneAndUpdate pre middleware!!!");
next();
});