bcrypt 错误:需要数据和哈希参数

问题描述 投票:0回答:16

我收到一个 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);
            }
        });
    })
javascript bcrypt
16个回答
42
投票

bcrypt.compare
需要3个参数; passwordToCheck、passwordHash 和一个回调。 (查看示例文档)

此错误表示前两个参数中的一个或两个为空或未定义。因此,请确保它们都正确传递。 (不是 null 或 undefined)


7
投票

为什么我们会遇到这个错误?

bcrypt Error: data and hash arguments required

例子

bcrypt.compare(first, second)

答案: 因为第二个密钥哈希密码不存在(null或未定义)或第一个,它们相互比较。


5
投票

我用过

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

3
投票

我在使用 node js 和 mongoose 时遇到了同样的错误。这是由在用户模型中添加到名为

select: false
的密码的属性引起的。

去掉后就可以了


2
投票
const passwordMatch = await bcrypt.compare(password, user.password);

确保您提供原始密码和哈希密码。这将返回一个布尔值。


0
投票

我有同样的错误,问题是在调用从数据库读取的函数时缺少

await


0
投票

这个问题的步骤: 1-确保 bcrypt 函数之前有 awir 2-如果问题仍然存在,则问题出在数据库(mongodb)中,尝试创建新数据库 一个例子:

const match = await bcrypt.compare(password,userValid.password);
            if (match) {
                res.send("login successful")
            }else{
                res.send("wrong password")
            }
        }

0
投票

我遇到了同样的问题,但我使用的是

bycrypt.compare()
的同步形式,即
bcrypt.compareSync()
,所以我将其更改为
bcrypt.compare()
并且效果很好。


0
投票

使用

findOne({})

代替

find()

尝试

console.log()
查看和验证数据。


0
投票
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)
}

0
投票

如果从数据库加载数据时忘记添加await,也会出现该问题。 忘记添加“等待”后我得到了同样的错误。

let user = User.findOne({ username: req.body.username });

let user = await User.findOne({ username: req.body.username });


0
投票

我也有这个问题,我在用户模型中设置了密码

select:false
,并通过将
select('+password')
添加到登录路径来解决


0
投票

我知道所有的问题都解决了,但也许有人发现这段代码对他有用

const passwordMatch = await bcrypt.compare(password, user.rows[0].s_password);

点后面的名字就是你在数据库中使用的名字,就是字段


0
投票

我有同样的问题,发现我在比较时错过了一个

await
因此在比较时收到一个空值。

// Compare incoming & stored password
const matchedPassword = await bcrypt.compare(password, userExists.password)

此外,第一个参数应该是纯文本密码,而第二个参数是散列密码。


0
投票

好吧,大家聚在一起!

首先,如果您的模式中有 "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',
      });
    }

0
投票

我也遇到了同样的问题。我意识到 usermodel.find() 返回所有用户的数组,但 users.findOne() 返回一个对象。你应该使用后者。

© www.soinside.com 2019 - 2024. All rights reserved.