node.js - Bcrypt 密码比较不起作用。在 Node.js Express App 中,甚至 user.password 都是空的
问题描述
在这里,我正在使用 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'});
});
});
});
使用有效的登录凭据显示
{"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'});
});
我在 Windows 10 上使用 WebStorm。
节点版本为11.12.0
项目包.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"
}
如果有人有答案,请告诉我。谢谢
解决方案
您的代码没有任何问题。我在这里测试过它。我看到的唯一异常是在发送响应时,您有一个响应数组,但将其作为单个对象读取。
这就是我所说的上述行话的意思
代替
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将帮助您使用已有的代码。
推荐阅读
- angular - 如何在标签中发送授权
- c# - 将异常的 JSON 字符串转换为 List
- html - 单击固定标题中的相应链接时如何获取该部分
- design-patterns - 为什么代理模式被归类为结构模式?
- java - 为 Java 谷歌翻译设置 API_Key
- kubernetes - Kubernetes:在被 OOMKilled 之前打印日志
- serialization - 在 Python3.5+ 中序列化/反序列化对象 <->dict <-> JSON 的最简单和 Pythonic 方法
- el - 如何在Nifi中制作多个变量值来一一替换EL表达式?
- c - 如何调用作为参数接收的 C 函数
- python - 如何返回从使用 PySNMP 完成的循环中获得的两个值?