bcrypt compareSync"未处理的拒绝错误:数据和哈希必须是字符串"

时间:2017-05-19 06:59:16

标签: postgresql error-handling bcrypt knex.js

我使用knex从我的数据库中选择特定用户密码。这个哈希密码会在这样的对象中返回给我:

[匿名{      password_hash:      ' $ 2A $ 10 $ zRSFdNJsg8S3Xv1I73gjYuRu.Mw / 9Dtujh0dTqrtc9DA12vUHuqbK' }]

当我尝试使用bcrypt.compareSync来比较输入的密码和数据库中存在的密码时,它会给出一个错误,说数据和散列必须是字符串。我尝试使用.toString()方法和JSON.stringify(password_hash)。但两个都没有帮助。我如何让它工作?任何帮助将不胜感激。谢谢。

这是我的代码:

knex('users').where({
    email: req.body.loginEmail
  }).select('password_hash')
  .then(function(password_hash) {
      //console.log("resp", password_hash)
      console.log("JSON stringifies",JSON.stringify(password_hash))
      console.log("req", req.body.loginPass)
      console.log('hash', password_hash)
      bcrypt.compareSync(req.body.loginPass, JSON.stringify(password_hash), function(err, doesMatch){
      if (doesMatch){
        console.log("Passwords Match")
        req.session.email = rows[0].email;
        var templateVars = {
          emale: req.session.email
        }
        res.render('/dashboard', templateVars)
      } else {
        console.log("THIS IS THE ERROR", err);
        res.send("I DONT KNOW YOU. SIGN UP FIRSt.")
      }
    })
  })

我的整个错误

Unhandled rejection Error: data and hash must be strings
at Object.compareSync (/vagrant/CaloBoxInc/node_modules/bcrypt/bcrypt.js:144:15)
at /vagrant/CaloBoxInc/server.js:159:14
at tryCatcher (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/promise.js:512:31)
at Promise._settlePromise (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/promise.js:569:18)
at Promise._settlePromise0 (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/promise.js:614:10)
at Promise._settlePromises (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/promise.js:693:18)
at Async._drainQueue (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/async.js:133:16)
at Async._drainQueues (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/async.js:143:10)
at Immediate.Async.drainQueues (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/async.js:17:14)
at runCallback (timers.js:570:20)
at tryOnImmediate (timers.js:550:5)
at processImmediate [as _immediateCallback] (timers.js:529:5)

4 个答案:

答案 0 :(得分:1)

可能是你的req.body.loginPass不是字符串吗? JSON.stringify总是返回undefined / string,如果参数未定义,bcrypt会返回不同的错误,这样参数就不会出现问题。

尝试将req.body.loginPass强制转换为字符串,如下所示:

bcrypt.compareSync(´´+ req.body.loginPass, ...

(仅用于调试目的......虽然您应该已经从早期的控制台日志中看到它不是字符串)。

答案 1 :(得分:0)

如果传递给bcrypt.compareSync函数的一个或多个参数未定义或为null,则会出现此错误。

答案 2 :(得分:0)

此问题的解决方案是将数据库中密码字段的数据类型更改为char(150)以避免被截断。希望对您有所帮助。

答案 3 :(得分:0)

转到您的 mongoose 文件,您可以在其中设置电子邮件类型和密码。将密码类型从 Number 更改为 String