我正在尝试使用bcrypt模块比较我的登录系统的密码,但是似乎不起作用。一旦将数据提交到表单中,我就会收到{“ message”:“内部服务器错误”}(已定义)。我在做什么错了?
这是auth-controller.js:
var mysqlConnection = require ('../config');
const bcrypt = require ('bcrypt');
module.exports.auth = async function (req, res) {
var password = req.body.password
var email = req.body.email
console.log(email, password);
let pwComparison
try {
//Check the password
pwComparison = await pwCompare(password)
//Compare the hashed password
password = await bcrypt.compare(password,results)
} catch (e) {
return res.status(500).json({message: 'Internal Server Error'})
}
if (pwComparison) {
res.redirect('/')
}
async function pwCompare(password) {
let query = `SELECT password FROM users where password = ${password}`
return new Promise((resolve,reject)=> {
mysqlConnection.query(query, function(error,results) {
if (error) {
return reject (error)
}
return resolve(results)
})
})
}}
答案 0 :(得分:0)
您不应查询密码,而应查询用户。数据库中的密码大概是加密的,因此来自客户端的值将永远不会匹配。我猜您正在尝试将null与字符串进行比较,这可能是您的错误出处。但是,这对于记录错误很有帮助,因此您将肯定知道。
尝试一下:
module.exports.auth = async function (req, res) {
const password = req.body.password
const email = req.body.email
console.log(email);
let user = null;
let isMatch = false;
try {
//Check the password
user = await getUserByEmail(email)
//Compare the hashed password
isMatch = await bcrypt.compare(password, user.password)
} catch (e) {
return res.status(500).json({message: 'Internal Server Error'})
}
if (isMatch) {
req.user = user;
res.redirect('/');
}
async function getUserByEmail(email) {
let query = "SELECT password FROM users where email = ? LIMIT 1";
return new Promise((resolve,reject)=> {
mysqlConnection.query(query, [email], function(error,results) {
if (error) {
return reject (error)
}
if (results.length == 1)
return resolve(results[0])
else
return resolve(null)
});
})
}}
根据您的评论进行更新。
好吧,我对查询的思念;您将返回与查询匹配的用户数组,这意味着仅一个数组。无论如何,您都需要从该阵列获取实际用户。
我已经更新了查询,以将搜索限制为单个用户(即使您只有唯一的电子邮件地址,也可以得到很小的性能提升),还可以查询回调以返回单个返回的行而不是数组。有人可能会说,找不到用户应该是reject()
而不是空结果,我将这个决定留给您。