Node.js Bcrypt错误:非法参数字符串未识别

Node.js Bcrypt错误:非法参数字符串未识别,node.js,Node.js,这是我的完整代码 var express = require('express'), app = express(), mongoose = require('mongoose'), bodyParser = require('body-parser'), morgan = require('morgan'), webToken = require('jsonwebtoken'), bcrypt = require('bcryptjs'),

这是我的完整代码

var express = require('express'),
    app = express(),
    mongoose = require('mongoose'),
    bodyParser = require('body-parser'),
    morgan = require('morgan'),
    webToken = require('jsonwebtoken'),
    bcrypt = require('bcryptjs'),
    assert = require('assert');
    Schema = mongoose.Schema,
    secretKey = "omjdiuwkslxmshsoepdukslsj";

//User Schema
var userSchema = new Schema({
    username: {type: String, required: true, index: {unique:true}},
    password: {type: String, required: true, select: false}
})

userSchema.pre('save', function(next){
    var user = this;

    if(!user.isModified('password')) return next();

    bcrypt.hash(user.password, null, null, function(err, hash){
        if(err) return next(err);

        user.password = hash;
        next();
    })
});

userSchema.methods.comparePassword = function(password){
    var user = this;

    bcrypt.compare(password, user.password, function(err, result){
        if(err){
            console.log(err);
        }
        else {
            console.log("passwords match!");
            return;
        }
    })
}

var userModel = mongoose.model('users', userSchema);


//Connecting to Mongo
mongoose.connect("mongodb://localhost/userstories", function(err){
    if(err) {
        console.log(err);
    }
    else {
        console.log("Connected to database!");
    }
});

//Creating Token
function createToken(user){
    var token = webToken.sign({
        _id: user.id,
        username: user.username
    },  secretKey,{
        expiresIn: 30 * 60 * 1000
    })
    return token;
    }

//Middlewares
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(morgan('dev'));

//Api's

app.post('/signup', function(req, res){    
    var user = new userModel({
        username: req.body.username,
        password: req.body.password
    })

    user.save(function(err){
        if(err){
            console.log(err);
        }

        else{
            res.json({message: "User created!"});
        }
    })
})

app.post('/login', function(req, res){

    userModel.findOne({username: req.body.username}, function(err, user){
        if(err) console.log(err);

            if(!user){
                res.send("User not found!");
            }
                 else if(user){

                      var validPassword = user.comparePassword(req.body.password);

                       if(validPassword){
                                var tokens = createToken(user);

                                res.json({
                                    success: true,
                                    message: "Successfully logged In",
                                    token: tokens
                                });
                        } 

                            else {
                                    res.send("Invalid password");
                                  }

                     }
    })
});


//Running the server
app.listen(3000, function(err){
    if(err) console.log("port not working");
    else{
        console.log("Everything went just fine");
    }
})

我尝试了各种方法,在这里看到了所有的答案。但似乎没有人遇到这个非法的论点错误。请帮我解决这个问题。我肯定有一个我看不到的错误。我曾经尝试过相同的代码进行身份验证,但得到了相同的错误。错误:非法参数:字符串,函数

但是我没有发现代码有任何问题。问题是,我用相同的用户名和不同的密码注册了两个用户。然后,当我尝试使用用户名和密码登录时,发生了此错误并停止了服务器


看来你也面临着同样的问题。如果您不想在代码中出现错误,请确保这些内容没有错误

我在使用时也遇到了相同的错误
bcrypt.compareSync(“要与散列进行比较的输入”,散列)

后来我发现我应该在第一个输入参数中传递实际值,即(生成散列的实际值)和第二个输入参数中的散列,但我在两个输入参数中都传递了散列值

在纠正了同样的错误之后,它给了我想要的输出,是真是假


您还可以运行并检查代码。

在将其发送到
bcrypt.compare()
之前,请检查
user.password
的值


很可能,您获取用户时没有包含
密码
属性,导致值
未定义
。如果您设置了自定义
属性,或者您使用的范围不包括道具,则在Sequelize中可能会发生这种情况。

您的代码在这里是错误的。你会看到的

var validPassword = user.comparePassword(req.body.password);
如果您使用
bcryptjs
第三方插件,就像这样

let validPassword = bcrypt.compare(req.body.password, user.password);

bcrypt.compare(密码、哈希密码)

在您的用户模式中,您正在将密码字段的
select
设置为false。这意味着,当您试图在
登录
请求中查找模式中的用户时,您将不会获得
密码
字段的值或模式中定义了
选择
错误的任何其他字段的值

您需要做的是指定在找到用户时需要密码:

app.post('/login', function(req, res){
  userModel.findOne({username: req.body.username}, 'password', function(err, user){
   // continue
}

这将仅从数据库返回
\u id
密码。如果要返回其他字段,则必须将其添加到:

app.post('/login', function(req, res){
  userModel.findOne({username: req.body.username}, 'password firstName lastName email', function(err, user){
   // continue
}

这样做:

UserSchema.pre('save', async function (next) {
  const hash = await bcrypt.hash(this.password, 10);

  this.password = hash;
  next()
})

您需要指定还需要密码,因为您已将密码上的select属性设置为false。
因此,在获取用户时,请确保明确指定您还需要密码。添加
。在查询用户时,在用户对象上选择(“+password”)

在我的特殊情况下,我处理此错误,上下检查所有代码几乎两天都没有成功。
最后,我们意识到MariaDB中的列密码是大写的。从理论上讲,这一点都不会影响,但我决定将其重命名为小写和bum!问题已解决。

您正在使用user.password!!user.password来自哪里?