Mongoose虚拟字段未更新

时间:2015-04-05 15:51:28

标签: node.js mongoose

我为这样的用户创建了一个模式:

    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('userId',{$ set:{password:'456'}},cb)

2 个答案:

答案 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();
});