2015-04-05 3 views
2

я создал схему для пользователя, как это: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 ('идентификатор пользователя', {$ множество: {пароль: '456'}}, центибар)

ответ

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(); 
}); 
Смежные вопросы