提问者:小点点

无法将存储在MySQL数据库中的密码与使用bcrypt从前端输入的密码进行比较


我正在从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进行比较,但在控制台中出现错误


共1个答案

匿名用户

让我们用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