Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js PassportJS(本地)与Sequelize和Express在序列化用户后挂起_Node.js_Passport.js_Sequelize.js_Passport Local - Fatal编程技术网

Node.js PassportJS(本地)与Sequelize和Express在序列化用户后挂起

Node.js PassportJS(本地)与Sequelize和Express在序列化用户后挂起,node.js,passport.js,sequelize.js,passport-local,Node.js,Passport.js,Sequelize.js,Passport Local,我正在尝试使用我在中找到的教程使登录生效。我修改了代码以使用Sequelize。我能够验证用户名和密码,但序列化用户后,它重定向到的页面不会加载。我想知道我是否错过了什么 我并没有真正得到一个错误,但重定向到/test/home页面被挂起,它一直在执行post请求。它似乎也没有运行req.isAuthenticated() 下面是我的app.js的一个片段: // configuring passport var passport = require('passport'); var expre

我正在尝试使用我在中找到的教程使登录生效。我修改了代码以使用Sequelize。我能够验证用户名和密码,但序列化用户后,它重定向到的页面不会加载。我想知道我是否错过了什么

我并没有真正得到一个错误,但重定向到/test/home页面被挂起,它一直在执行post请求。它似乎也没有运行req.isAuthenticated()

下面是我的app.js的一个片段:

// configuring passport
var passport = require('passport');
var expressSession = require('express-session');
app.use(expressSession({ secret: 'keyboard cat', resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());

// initialize passport
var initPassport = require('./passport/init');
initPassport(passport);

// routes
var routes = require('./routes/index');
var loginTest = require('./routes/test')(passport);
var gameRoute = require('./routes/game');
app.use('/', routes);
app.use('/test', loginTest);
app.use('/game', gameRoute);
init.js:

var login = require('./login');
var User = require('../server/models/index').user;

module.exports = function(passport){
    passport.serializeUser(function(user, done) {
        console.log('serializing user: ');
        done(null, user.get('id'));
    });

    passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            console.log('deserializing user:',user);
            done(err, user);
        });
    });

    // setting up Passport Strategies for Login
    login(passport);

}
test.js(路由器)

login.js

var LocalStrategy   = require('passport-local').Strategy;
var User = require('../server/models/index').user;
var bCrypt = require('bcrypt-nodejs');

module.exports = function(passport){

    passport.use('login', new LocalStrategy({
          passReqToCallback : true
      },
      function(req, username, password, done) { 
        // check if user with username exists or not
        User.findOne({ 
          where: {
            username:  username 
          }
        }).then(function(user) {
            if (!user){
              console.log('User Not Found with username '+username);
              return done(null, false, { message: 'Incorrect username.' });       
            }
            if (!isValidPassword(user, password)){
              console.log('Invalid Password');
              return done(null, false, { message: 'Incorrect password.' });
            }
            console.log('username and password matched');
            return done(null, user);
          }
        );

      })
  );

  var isValidPassword = function(user, password){
    return bCrypt.compareSync(password, user.password);
  }

}

经过一些研究,我意识到导致问题的原因是反序列化。我的console.log没有给我一个错误,因为它卡在User.findById(…)上。Sequelize不会返回回调,而是一个承诺

而不是将其用于init.js,

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    console.log('deserializing user:',user);
    done(err, user);
  });
});
改用此语法

passport.deserializeUser(function(id, done) {
  User.findById(id).then(function(user) {
    console.log('deserializing user:',user);
    done(null, user);
  }).catch(function(err) {
    if (err) {
      throw err;
    }
 });
});
passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    console.log('deserializing user:',user);
    done(err, user);
  });
});
passport.deserializeUser(function(id, done) {
  User.findById(id).then(function(user) {
    console.log('deserializing user:',user);
    done(null, user);
  }).catch(function(err) {
    if (err) {
      throw err;
    }
 });
});