“错误:非法参数:字符串,未定义”并在节点JS中停止服务器

时间:2017-07-02 13:23:40

标签: javascript node.js authentication

我正在尝试在节点JS中构建日志记录应用程序。在这里密码验证应用程序无法正常工作。当我输入用户名和密码时,它会发生错误并停止服务器。

this is the error.

enter image description here

以下是身份验证部分的代码

passport.use(new LocalStrategy(
function(username, password, done) {
    User.getUserByUsername(username, function(err, user){
       if(err) throw err;
       if (!user) {
           return done(null, false, {message: 'Unknown user'});
       } 

       User.comparePassword(password, user.password, function(err, isMatch){
           if(err) throw err;
           if (isMatch) {
               return done(null, user);
           } else {
               return done(null, false, {message: 'Invalid password'});
           }
       });
    });
}));

此代码适用于未知用户。 但它不适用于比较用户名和密码。我在这里看不到任何错误。我想要一个帮助来解决这个问题。

6 个答案:

答案 0 :(得分:0)

我在这里发现了问题。这不是关于代码的事情。

事情是我注册了两个用户名相同且密码不同的用户。然后,当我尝试使用用户名和一个密码登录时,发生此错误并停止服务器。

因为找到用户输入的用户名的密码有尴尬的情况。因为有两个密码具有相同的用户名。

答案 1 :(得分:0)

就我而言,我正在使用社交登录/注册。当用户使用社交登录选项注册时,存储的密码值为“NULL”。

所以我刚加了这个小支票:

  comparePassword: function(password, user){
    if (!user.password)
      return false;
    return bcrypt.compareSync(password, user.password);
  }

答案 2 :(得分:0)

“模型/user.js”

在comparePassword内部

module.exports.comparePassword = (candidatePassword, hash, callback) => {...) 

添加此代码:

bcrypt.hash(candidatePassword, 10, (err, hash) => {
    if(err) {
        throw err;
    }
    bcrypt.compare(candidatePassword, hash, (err, isMatch) => {
        if(err) {
            throw err;
        }
        callback(null, isMatch);
    });
});

答案 3 :(得分:0)

在这里,我们从登录页面中获取用户名和密码,并且 通过数据库中的用户名找到我们的用户,然后 将其加密密码与用户输入的密码进行匹配

passport.use(new LocalStrategy(
    (username,password,done)=> {
        db.users.findOne({username: username},(err, user)=> {
            if(err) return done(err);

            if(!user) {
                return done(null,false,{message: 'Incorrect Username'});
            }
            bcrypt.compare(password, user.password,(err,isMatch)=> {
                if(err) return done(err);
                if(isMatch) {
                    return done(null, user);
                } else {
                    return done(null, false,{message: 'Incorrect Password'});
                }
            });
         });
      }
   ));

答案 4 :(得分:0)

您还需要对盐和密码分配进行等待。

喜欢这个

const salt = await bcrypt.genSaltSync(10);
const password = await req.body.password;

答案 5 :(得分:0)

以宇宙程序员的名义

就我而言,我忘记选择密码 因为在数据库中密码是 ((select: false))

此应用代码

const user = await User.findOne({email}).select("+password")

我忘了将 ((.select("+password"))) 附加到 findOne

我收到了这个错误; 错误:非法参数:字符串,未定义

和这个数据库代码

const User = new mongoose.Schema({
    username:{
        type:String,
        required: [true,"نام کاربری ضروری است"]
    },
    email:{
        type:String,
        required: [true,"رایانامه ضروری است"],
        unique: true,
        match:[
            /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{1,3})$/,
            "لطفا یک رایانامه صحیح وارد کنید"
        ]
    },
    password:{
        type:String,
        required:[true,"رمز ضروری است"],
        minlegth: 5,
        select: false
    }
})