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在最后一个示例中进行调用时,它会按预期更新电子邮件地址,但还会重新加密密码,这意味着如果用户随后注销,则无法再次登录。
谁能帮助解决这个问题?
尝试这个:
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)
| 归档时间: |
|
| 查看次数: |
976 次 |
| 最近记录: |