我使用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)
答案 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
。