我收到一个bcrypt错误,声明需要数据和哈希参数,引用我的routes.js文件中的第44行。据我所知,我传递的信息是:bcrypt.compare的第一个参数是用户输入的密码,第二个参数是从db中检索的哈希密码。我做错了什么?
bcrypt.compare(req.params.password, user.password, function...
routes.js
'use strict'
var express = require('express');
var router = express.Router();
var User = require('../app/models/user');
//password hashing
var bcrypt = require('bcrypt');
var count = 0;
router.use(function(req, res, next) {
count++;
console.log('API hit count = %s', count);
next();
});
// /users post(create new user) get(specific user)
router.route('/users')
.post(function(req,res) {
var user = new User();
user.username = req.body.username;
user.password = bcrypt.hashSync(req.body.password, 10);
//save the user and checkfor errors
user.save(function(err) {
if (err) {
res.send(err);
} else {
res.json({message: "User created!"});
}
});
})
router.route('/users/:username')
.get(function(req, res) {
var query = {
username: req.params.username,
};
User.findOne(query, function(err, user) {
if (err) {
res.send(err);
} else {
bcrypt.compare(req.params.password, user.password, function(err, res) {
if(err) {
console.log('Comparison error: ', err);
}
})
res.json(user);
}
});
})
答案 0 :(得分:12)
bcrypt.compare
有3个参数; passwordToCheck,passwordHash和回调。 (Check the documentation for examples)
此错误表示前两个参数中的一个或两个都为null或未定义。因此,请确保它们都正确传递。 (不是空或未定义)
答案 1 :(得分:1)
我用过
const user = await User.find({email: req.body.email}) //which returned all users
//除非我引用索引0中的第一个用户,否则我无法将user.password传递给// bcrypt compare方法,因为它不是字符串 我将其更改为
await User.findOne({email: req.body.email})//from which i can use user.password in the //bcrypt compare method
答案 2 :(得分:1)
const passwordMatch = await bcrypt.compare(password, user.password);
确保提供原始密码和哈希密码。这将返回一个布尔值。
答案 3 :(得分:0)
我有同样的错误,调用从数据库读取的函数时,问题是缺少await
答案 4 :(得分:0)
我遇到了同样的问题,但我使用的是 bycrypt.compare() 的同步形式,即 bcrypt.compareSync(),所以我将其更改为 bcrypt.compare() 并且它完美运行。