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