Сравнение паролей Bcrypt не работает, даже user.password пуст в приложении Node.js Express - PullRequest
2 голосов
/ 21 марта 2019

Здесь я изучаю MongoDB с помощью приложения Node.js Express.Я защищаю свои пароли с помощью Bcrypt, Encrypt и сохранение в 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'});
    });
  });
});

С действительными учетными данными для входа в систему отображается

{"status": 404, "data": "Userне найден "}

Даже если я пытаюсь отправить только пароль, если электронная почта совпадает, все равно ничего не возвращается.

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

Я использую WebStorm в Windows 10.

версия узла: 11.12.0

Project 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 Ответ

1 голос
/ 21 марта 2019

В вашем коде нет ничего плохого.Я проверил это на моей стороне здесь.Единственная аномалия, на которую я обращаю внимание, - при отправке ответа вы получаете массив ответов, но читаете его как отдельный объект.

Вот что означает приведенный выше жаргон

ВМЕСТО

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 поможет вам с кодом, который у вас уже есть.

...