每次使用预保存挂钩保存时,Mongoose都会更改密码

时间:2017-07-28 11:36:08

标签: javascript node.js mongoose mongoose-schema

我使用预先保存的钩子和bcrypt来加密系统上的密码。它在创建或更改密码时工作正常。问题是,每当我更改并保存不同的字段时,它似乎都会重新加密密码,例如电子邮件。

可能更容易用代码解释。这是模特:

const UserSchema = new Schema({
    email: {
        type: String,
        required: true,
        lowercase: true,
        unique: true,
        trim: true
    },
    password: {
        type: String,
        required: true
    }
})

和钩子:

UserSchema.pre('save', function(next){
    const user = this;
    console.log(user);
    bcrypt.genSalt(10, function(err, salt){
        if (err){ return next(err) }

        bcrypt.hash(user.password, salt, null, function(err, hash){
            if(err){return next(err)}

            user.password = hash;
            next();
        })
    })
});

这是我更新电子邮件地址的代码:

module.exports = function(req, res){
    User.findOne({ _id: req.body.user}, function(err, doc){
        if(err){
            console.log(err);
            return;
        }

        doc.email = req.body.data;
        doc.save(function(err, returnData){
            if (err){
                console.log(err);
                return;
            }
            res.send(returnData);
        })

    })
}

因此,当我在最后一个示例中调用doc.save时,它会按预期更新电子邮件地址,但它也会重新加密密码,这意味着如果用户随后注销,他们就无法登录又回来了。

任何人都可以帮忙解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

试试这个:

UserSchema.pre('save', function(next){
    if (!user.isModified('password')) return next();

    const user = this;

    bcrypt.genSalt(10, function(err, salt){
        if (err){ return next(err) }

        bcrypt.hash(user.password, salt, null, function(err, hash){
            if(err){return next(err)}

            user.password = hash;
            next();
        })
   })
});

答案 1 :(得分:1)

好的,我设法解决了 - 在预保存挂钩中只需要一些条件逻辑:

UserSchema.pre('save', function(next){
    if(!this.isModified('password')){
        return next();
    } // Adding this statement solved the problem!!
    const user = this;
    bcrypt.genSalt(10, function(err, salt){
        if (err){ return next(err) }

        bcrypt.hash(user.password, salt, null, function(err, hash){
            if(err){return next(err)}

            user.password = hash;
            next();
        })
    })
});