我收到一个 bcrypt 错误,指出需要数据和哈希参数,引用我的 routes.js 文件中的第 44 行。据我所知,我正在传递该信息:bcrypt.compare 的第一个参数是用户输入的密码,第二个是从数据库中检索到的散列密码。我做错了什么?
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);
}
});
})
bcrypt.compare
需要3个参数; passwordToCheck、passwordHash 和一个回调。 (查看示例文档)
此错误表示前两个参数中的一个或两个为空或未定义。因此,请确保它们都正确传递。 (不是 null 或 undefined)
为什么我们会遇到这个错误?
bcrypt Error: data and hash arguments required
例子:
bcrypt.compare(first, second)
答案: 因为第二个密钥哈希密码不存在(null或未定义)或第一个,它们相互比较。
我用过
const user = await User.find({email: req.body.email}) //which returned all users
//除非我引用索引 0 中的第一个用户,否则我无法将 user.password 传递给 //bcrypt 比较方法,因为它不是字符串 我改成了
await User.findOne({email: req.body.email})//from which i can use user.password in the //bcrypt compare method
我在使用 node js 和 mongoose 时遇到了同样的错误。这是由在用户模型中添加到名为
select: false
的密码的属性引起的。
去掉后就可以了
const passwordMatch = await bcrypt.compare(password, user.password);
确保您提供原始密码和哈希密码。这将返回一个布尔值。
我有同样的错误,问题是在调用从数据库读取的函数时缺少
await
这个问题的步骤: 1-确保 bcrypt 函数之前有 awir 2-如果问题仍然存在,则问题出在数据库(mongodb)中,尝试创建新数据库 一个例子:
const match = await bcrypt.compare(password,userValid.password);
if (match) {
res.send("login successful")
}else{
res.send("wrong password")
}
}
我遇到了同样的问题,但我使用的是
bycrypt.compare()
的同步形式,即 bcrypt.compareSync()
,所以我将其更改为 bcrypt.compare()
并且效果很好。
使用
findOne({})
代替
find()
尝试
console.log()
查看和验证数据。
try {
let match = await bcrypt.compare(password, user.password)
if(!match){
return res.json({mass: "invalid Created"})
}else{
res.send('Wrong password')
}
console.log('success fulli', user)
res.render('pages/auth/login', {title: 'Login In Your Account'})
} catch(e) {
console.log(e)
next(e)
}
如果从数据库加载数据时忘记添加await,也会出现该问题。 忘记添加“等待”后我得到了同样的错误。
let user = User.findOne({ username: req.body.username });
let user = await User.findOne({ username: req.body.username });
我也有这个问题,我在用户模型中设置了密码
select:false
,并通过将select('+password')
添加到登录路径来解决
我知道所有的问题都解决了,但也许有人发现这段代码对他有用
const passwordMatch = await bcrypt.compare(password, user.rows[0].s_password);
点后面的名字就是你在数据库中使用的名字,就是字段
我有同样的问题,发现我在比较时错过了一个
await
因此在比较时收到一个空值。
// Compare incoming & stored password
const matchedPassword = await bcrypt.compare(password, userExists.password)
此外,第一个参数应该是纯文本密码,而第二个参数是散列密码。
好吧,大家聚在一起!
首先,如果您的模式中有 "select":false 作为密码, 你应该这样使用它:
const {email,passord} = req.body
const user = await User.findOne({ email }).select('+password'); // that will allow us the edit password property without revealing it.
之后你可以调用你的比较函数
if (!(await user.comparePassword(password, user.password))) {
res.status(400).json({
status: 'Fail',
msg: 'Incorrect nickname or password',
});
}
我也遇到了同样的问题。我意识到 usermodel.find() 返回所有用户的数组,但 users.findOne() 返回一个对象。你应该使用后者。