如果密码输入为空,我很难阻止在数据库中更新用户密码。
以下是负责更新用户数据的路线:
router.put('/update', passport.authenticate('jwt', {session: false}), (req, res) => {
let user = req.user;
user.firstname = req.body.firstname;
user.lastname = req.body.lastname;
user.username = req.body.username;
user.email = req.body.email;
user.password = req.body.password || null;
User.updateUser(user, (err) => {
if (err) {
res.json({
success: false,
message: 'User details couldn\'t be updated.'
});
} else {
res.json({
success: true,
message: 'User updated'
});
}
});
});
这是User模型方法,它生成密码的哈希并将新数据保存在数据库中:
module.exports.updateUser = function (user, callback) {
if (user.password) {
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(user.password, salt, (err, hash) => {
if (err) throw err;
user.password = hash;
});
});
}
user.save(callback);
};
我检查是否给出了密码值,但是如果密码没有给出新的值,我就不知道如何在数据库中保留旧的加密密码。如果用户没有填写密码输入,它将被保存为null,正如预期的那样......
我希望有一种实现这一目标的方法,我现在无法弄清楚我是初学者。
提前谢谢!
答案 0 :(得分:0)
我猜您正在使用Mongoose与数据库进行通信。 更改此代码行:
user.password = req.body.password || null;
用这个:
if(req.body.password != null) {
user.password = req.body.password
}else{
/* find each user with a last name matching 'user.userame', selecting
/*the `password` field and returning the result in 'usr'
*/
User.find({'username' : user.username}, 'password', function (err, usr) {
if (err) return handleError(err);
user.password = usr.password;
})
}
答案 1 :(得分:0)
基于@Neil Lunn关于检查文档的建议,我想出了一个解决方案。我将readTable
方法更改为:
updateUser
如果密码存在,则按原样更新所有内容,如果未提供密码,则仅更新除密码外的所需字段。
也许这不是最好的解决方案,但它现在有效。
谢谢!