我正在从MySQL中的前端为注册用户输入密码。现在,当im登录时,我希望使用bcrypt-nodejs将输入的密码与数据库中原始存储的密码进行比较。但不能这样做。我是Node.js的初学者,请帮忙!!
这段代码在我的server.js文件中,它是主节点服务器文件。
app.post('/signin', (req,res)=>{
const {email} = req.body;
let post= {email: email};
let sql= 'SELECT password FROM users WHERE email= ?';
let query= db.query(sql, post,(error,result)=>{
if(error)
{
throw error;
}
else if(!error)
{
bcrypt.hash(result, null,null, function(err,res){
});
bcrypt.compare(req.body.password, hash, (err,res)=>{
if(err)
{
throw error;
}
else if(res)
{
res.send('signin successful');
}
}
else {
res.status(400).json('error logging in');
}
//res.json('signin');
});
})
})
正如您所看到的,Im试图对来自数据库的口令结果进行散列,并将其与用户从前端输入的req.body.password进行比较,但在控制台中出现错误
让我们用async/await
稍微重写一下,使其更易读
app.post('/signin', async (req, res) => {
const { email } = req.body;
let post = { email: email };
let sql = 'SELECT password FROM users WHERE email= ?';
const queryResult = await new Promise(resolve => db.query(sql, post, (error, result) => resolve(result)));
// I assume you should access here your hash with something like this queryResult.password`
const hashStoredInDb = queryResult.password;
const compareResult = await new Promise(resolve => bcrypt.compare(req.body.password, hashStoredInDb, (err, res) => resolve(res)));
// Your other verification logic based on compare result.
})
因此,主要的逻辑是将已存储在db中的散列密码与用户提供的散列密码进行比较。
此外,您还可以在提供的代码中添加一些验证,为了简单和可读性,我错过了一些try/catch
。