Javascript Nodejs-Passport身份验证始终返回失败重定向

Javascript Nodejs-Passport身份验证始终返回失败重定向,javascript,node.js,pug,passport.js,passport-local,Javascript,Node.js,Pug,Passport.js,Passport Local,我使用passportJs进行表单登录,它总是返回failureRedirect。我已经在堆栈溢出中搜索了这个问题,但仍然没有正确的答案。这是我的密码: 造形玉: form(method='post', action='/users/login', enctype='multipart/form-data') .form-group label Username input.form-control(name='username', type='text' placeho

我使用passportJs进行表单登录,它总是返回failureRedirect。我已经在堆栈溢出中搜索了这个问题,但仍然没有正确的答案。这是我的密码:

  • 造形玉:

    form(method='post', action='/users/login', enctype='multipart/form-data')
     .form-group
       label Username
       input.form-control(name='username', type='text'     placeholder='Enter Username')
    .form-group
      label Password
      input.form-control(name='password', type='password' placeholder='Enter password')
    input.btn.btn-default(name='submit', type='submit', value='Login')
    
路由器Hanlde正在使用express framework form Nodejs和passport中间件:

passport.serializeUser(function(user, done) {
 done(null, user.id);
});

passport.deserializeUser(function(id, done) {
User.getUserById(id, function(err, user) {
    done(err, user);
});
});

passport.use(new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password'
},
function(username, password, done) {
    User.getUserByUsername(username, function(err, user) {
        if (err) throw err;
        if (!user) {
            console.log('Unknown 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 {
                console.log('Invalid Password');
                return done(null, false, {
                    message: 'Invalid Password'
                });
            }
         });
      });
   }
));

  router.post('/login', passport.authenticate('local', {
    failureRedirect: '/users/login',
    failureFlash: 'Invalid username or password'
}), function(req, res) {
console.log('Authentication Successful');
req.flash('success', 'You are logged in ');
res.redirect('/');
 });

查看您在注释中共享的
getUserByUsername
函数,您似乎没有以正确的方式调用
getUserByUsername
的回调函数,因此它没有获取
user
对象,导致重定向失败。您共享的功能是:

module.exports.getUserByUsername = function(username, callback){
  var query = {username: username}; 
  User.findOne(query, callback); 
} 
将其更改为以下内容可以解决您的问题:

module.exports.getUserByUsername = function(username, callback){
  var query = {username: username}; 
  User.findOne(query, function(err, user) {
    callback(err, user);
  }); 
}

你能分享
getUserByUsername
comparePassword
函数的代码吗?@user2235057是的:我写在models文件夹的文件user.js:module.exports.getUserByUsername=function(username,callback){var query={username:username};user.findOne(query,callback);}module.exports.getUserByUsername=function(username,callback){var query={username:username};User.findOne(query,callback);}这是
getUserByUsername
函数的完整代码吗?如果是这种情况,则该函数中存在问题。代码应该是这样的:module.exports.getUserByUsername=function(username,callback){var query={username:username};User.findOne(query,function(err,User){callback(err,User)};}您还没有共享
comparePassword
函数,所以我不确定这是否正确。@user2235057感谢您的回复。我无法共享函数[ComparePassword]。这里是:module.exports.comparePassword=function(candidatePassword,hash,callback){bcrypt.compare(candidatePassword,hash,function(err,isMatch){if(err)return callback(err);callback(null,isMatch);}@user2235057:非常感谢。我已经通过了这个函数。太棒了。您必须精通passport中间件和express框架。如果可以,请回答这个问题。对于另一个像我一样有同样问题的人,我可以找到答案。如果有更多的源代码,请告诉我,我会提供源代码。非常感谢您的支持。