Bcrypt密码比较不起作用,即使在Node.js Express App中user.password为空

时间:2019-03-21 09:03:54

标签: node.js mongodb express mongoose bcrypt

在这里,我正在使用Node.js Express App学习MongoDB。 我使用Bcrypt来保护密码,加密并成功保存在mongodb中,但是当我尝试比较SigIn的密码时,它只是失败。

  

注册路线

router.post('/signUp', (req, res, next) => {

let userData = req.body;

mongoose.connect(DB_URL, {useNewUrlParser: true}, (err) => {

    if (err) throw err;

    console.log('DB is connected Successfully');

    bcrypt.hash(userData.password, saltRounds, function (err, hash) {

        User.create({
            name: userData.name,
            fname:userData.fname,
            email:userData.email,
            password:hash
        }).then(() => {
            //success callback
            res.send('Saved');

        }).catch(next);
    });
 });
});
  

登录路线

router.post('/signIn', (req, res) => {

const incomingEmail = req.body.email;
const incomingPassword = req.body.password;

mongoose.connect(DB_URL, {useNewUrlParser: true}, (err) => {

    if (err) throw err;

    console.log('DB is connected Successfully');

    User.find({incomingEmail}).then((user) => {
        if (user.length > 0) {
            bcrypt.compare(incomingPassword, user.password).then(function (result) {

                res.status(200).json({status: 200, data: user[0]});

            }).catch(() => {

                res.send('incorrect password')

            });

        } else {
            res.status(404).json({status: 404, data: 'User not found'});
        }
    }).catch(() => {
        res.status(404).json({status: 404, data: 'Email not matched'});
    });
  });
});

具有用于登录的有效凭据,它将显示

  

{       “状态”:404,       “ data”:“找不到用户”}

即使电子邮件匹配,我也只尝试发送密码,但仍然不返回任何内容。

User.find({incomingEmail}).then((user) => {
        res.send(user.password);
    }).catch(() => {
        res.status(404).json({status: 404, data: 'Email not matched'});
    });

我正在Windows 10上使用WebStorm。

节点版本为 11.12.0

项目package.json

"dependencies": {
"bcrypt": "3.0.4",
"body-parser": "latest",
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"express": "~4.16.0",
"mongodb": "^3.1.13",
"mongoose": "^5.4.17",
"mongoose-unique-validator": "^2.0.2",
"morgan": "~1.9.0"


}

如果有人有答案,请告诉我。谢谢

1 个答案:

答案 0 :(得分:1)

您的代码没有错。我已经在我这边进行了测试。我正在查看的唯一异常是在发送响应时,您有一个响应数组,但将其作为单个对象读取。

这是我上面所说的专业术语

代替

User.find({incomingEmail}).then((user) => {
    res.send(user.password);
}).catch(() => {
    res.status(404).json({status: 404, data: 'Email not matched'});
});

执行此操作

User.find({incomingEmail}).then((user) => {
        res.send(user[0].password);
    }).catch(() => {
        res.status(404).json({status: 404, data: 'Email not matched'});
});
  

或者在其他情况下

我能看到的是,您可以使用MONGOOSE ONLY FIND方法代替!您也可以使用 FINDONE 方法,这样就无需为单个用户读取JSON响应数组。 FINDONE 将帮助您使用已有的代码。