#node.js #mongodb #express #mongoose #bcrypt
#node.js #mongodb #экспресс #mongoose #bcrypt
Вопрос:
Здесь я изучаю MongoDB с Node.js Приложение Express. Я защищаю свои пароли с помощью 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'});
});
});
});
С действительными учетными данными для входа он показывает
{"status": 404, "data": "User not found" }
Даже я пытаюсь отправить только пароль, если совпадает адрес электронной почты, все равно он ничего не возвращает.
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. Попробуйте
User.find({email: incomingEmail})
вместо этого.2. Согласен с @LawrenceCherone, в вашей схеме, похоже, нет
incomingEmail
поля. Также нет необходимости устанавливать соединение с mongodb черезmongoose.connect
по каждому маршруту. Просто подключитесь к базе данных после начальной загрузки приложения.3. Суть в том, что «ваш код» на самом деле говорит о том,
User.find({ incomingEmail: incomingEmail })
что именно так работает деструктурирование4. @LawrenceCherone да, это сработало, но все еще
res.send(user.password)
отвечает пусто. здесь мне просто нужно знать, как выбрать конкретный элемент и отправить его в качестве ответа.
Ответ №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 поможет вам с кодом, который у вас уже есть.