每次我使用预先保存的钩子保存时,猫鼬都会更改密码

Chr*_*ris 5 javascript mongoose node.js mongoose-schema

我正在使用带有bcrypt的预保存钩子来加密系统上的密码。创建或更改密码时,它可以正常工作。问题在于,每次我更改并保存其他字段(例如电子邮件)时,它似乎都重新加密了密码。

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

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

和钩子:

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();
        })
    })
});
Run Code Online (Sandbox Code Playgroud)

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

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);
        })

    })
}
Run Code Online (Sandbox Code Playgroud)

因此,当我doc.save在最后一个示例中进行调用时,它会按预期更新电子邮件地址,但还会重新加密密码,这意味着如果用户随后注销,则无法再次登录。

谁能帮助解决这个问题?

Ste*_*ado 6

尝试这个:

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();
        })
   })
});
Run Code Online (Sandbox Code Playgroud)