【问题标题】:bcrypt Error: data and hash arguments requiredbcrypt 错误:需要数据和哈希参数
【发布时间】:2017-02-15 05:05:30
【问题描述】:

我收到一个 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 之前设置一个断点,看看req.params.passworduser.password 是什么。
  • @bejado Dammit,我的 app.js 中有一个错误,发送了一个未定义的密码。感谢您的帮助。

标签: javascript bcrypt


【解决方案1】:

bcrypt.compare 接受 3 个参数; passwordToCheck、passwordHash 和一个回调。 (Check the documentation for examples)

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

【讨论】:

  • 当您使用arrow function 语法而不是普通的function() 语法时,也会发生这种情况。因此,如果您想保留来自模型的this,请确保使用后一种语法,即从当前模式中提取某些内容时。这拯救了我的一天。谢谢!!!
  • await 语法不需要第三个参数。我的问题是两个参数之一没有我预期的值,因此修复了这个问题。
【解决方案2】:

为什么我们会遇到这个错误 bcrypt Error: data and hash arguments required

示例: bcrypt.compare(first, second)

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

【讨论】:

【解决方案3】:

我用过

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

【讨论】:

    【解决方案4】:
    const passwordMatch = await bcrypt.compare(password, user.password);
    

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我在使用 node js 和 mongoose 时遇到了同样的错误。这是由用户模型中名为select: false的密码添加的属性引起的。

        删除后就可以了。

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            我遇到了同样的问题,但是我使用的是bycrypt.compare()的同步形式,即bcrypt.compareSync(),所以我将其更改为bcrypt.compare(),它运行良好。

            【讨论】:

              猜你喜欢
              • 2019-11-09
              • 2020-09-10
              • 2020-12-13
              • 2017-11-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多