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

joh*_*mac 8 javascript bcrypt

我收到一个bcrypt错误,指出需要数据和哈希参数,引用我的routes.js文件中的第44行.据我所知,我传递的信息是:bcrypt.compare的第一个参数是用户输入的密码,第二个参数是从db中检索的哈希密码.我究竟做错了什么?

bcrypt.compare(req.params.password, user.password, function...
Run Code Online (Sandbox Code Playgroud)

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);
            }
        });
    })
Run Code Online (Sandbox Code Playgroud)

sap*_*apy 14

bcrypt.compare需要3个参数; passwordToCheck,passwordHash和回调.(查看文档中的示例)

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

  • 当您使用“箭头函数”语法而不是普通的“function()”语法时,也可能会发生这种情况。因此,如果您想保留来自模型的“this”,即从当前模式中提取某些内容时,请确保使用后一种语法。这救了我的命。谢谢!!! (2认同)

小智 8

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

例子bcrypt.compare(first, second)

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


小智 5

我用了

const user = await User.find({email: req.body.email}) //which returned all users
Run Code Online (Sandbox Code Playgroud)

//除非我引用索引0中的第一个用户,否则我无法将user.password传递给//bcrypt比较方法,因为它不是我将其更改为的字符串

await User.findOne({email: req.body.email})//from which i can use user.password in the //bcrypt compare method
Run Code Online (Sandbox Code Playgroud)