更新mongoose模型中的一个字段(node.js)

use*_*848 9 mongoose mongodb node.js

我有一个用户架构,我想更新一些信息,像这样.

User.findOne({_id: idd}, function(err, usr){
   usr.info = "some new info";
   usr.save(function(err) {
   });
});
Run Code Online (Sandbox Code Playgroud)

但该模型有一个保存挂钩以密码密码

UserSchema.pre('save', function(next) {
    if (this.password && this.password.length > 6) {
        this.salt = new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');
        this.password = this.hashPassword(this.password);
    }

    next();
});
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试保存时,需要使用已经充满仇恨的密码并再次哈希,任何想法如何避免这种情况?

Bat*_*eam 16

使用Model.Update并将新密码的创建移动到独立的功能.

var salt = new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');;
var newPassword = this.hashPassword("someNew password");
User.update({_id: idd}, {
    info: "some new info", 
    password: newPassword
}, function(err, affected, resp) {
   console.log(resp);
})
Run Code Online (Sandbox Code Playgroud)

  • 不推荐使用更新模型,而是使用 updateOne。 (2认同)

Tho*_*aux 5

你试过用isModified吗?

UserSchema.pre('save', function(next) {
    if (this.password && this.password.length > 6 && MYMODEL.isModified('password')) {
        this.salt = new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');
        this.password = this.hashPassword(this.password);
    }

    next();
});
Run Code Online (Sandbox Code Playgroud)