PassportJS(Local)与Sequelize和Express在序列化用户之后挂起

我正在尝试使用我在http://code.tutsplus.com/tutorials/authenticating-nodejs-applications-with-passport-cms-21619中find的教程进行login工作。 我修改了代码以使用Sequelize。 我能够validation用户名和密码,但序列化一个用户后,它redirect到的页面不会加载。 我想知道是否有什么我错过了。

我没有真正得到一个错误,但redirect到/testing/主页卡在悬而未决,并不断执行一个职位请求。 它似乎并没有运行req.isAuthenticated()

Executing (default): SELECT "id", "email", "username", "password" FROM "users" AS "user" WHERE "user"."username" = 'user14' LIMIT 1; username and password matched serializing user: POST /test/login 302 377.738 ms - 64 Executing (default): SELECT "id", "email", "username", "password" FROM "users" AS "user" WHERE "user"."id" = 16; GET /test/home - - ms - - Executing (default): SELECT "id", "email", "username", "password" FROM "users" AS "user" WHERE "user"."id" = 16; POST /test/home - - ms - - Executing (default): SELECT "id", "email", "username", "password" FROM "users" AS "user" WHERE "user"."id" = 16; POST /test/home - - ms - - 

这里是我的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(路由器)

 var express = require('express'); var router = express.Router(); var isAuthenticated = function (req, res, next) { if (req.isAuthenticated()) return next(); res.redirect('/test'); } module.exports = function(passport){ router.post('/login', passport.authenticate('login', { successRedirect: '/test/home', failureRedirect: '/test', failureFlash : true })); /* GET Home Page */ router.get('/home', isAuthenticated, function(req, res){ res.render('home', { user: req.user }); }); return router; } 

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); } } 

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

而不是使用这个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; } }); });