我正在使用带bcrypt的预保存钩子来加密系统上的密码。在创建或更改密码时它工作正常。问题在于,每次更改并保存不同的字段时,似乎都会重新加密密码,例如电子邮件。Mongoose每次使用预保存钩子保存时都会更改密码
可能更容易用代码解释。这里的模型:
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
在最后的例子,它会根据预期更新电子邮件地址,但它也会重新加密密码,这意味着如果用户登出,他们将无法再次登录。
任何人都可以帮助如何解决这个问题吗?
哈哈,我只是想它出来并添加了我自己的答案!尽管如此,我已将你的标记标记为正确的答案,感谢你花时间! – Chris
哈哈,谢谢克里斯 –