如果输入为空,请防止更新用户的密码?

时间:2017-06-14 08:38:49

标签: node.js mongodb express mongoose

如果密码输入为空,我很难阻止在数据库中更新用户密码。

以下是负责更新用户数据的路线:

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,正如预期的那样......

我希望有一种实现这一目标的方法,我现在无法弄清楚我是初学者。

提前谢谢!

2 个答案:

答案 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

如果密码存在,则按原样更新所有内容,如果未提供密码,则仅更新除密码外的所需字段。

也许这不是最好的解决方案,但它现在有效。

谢谢!