错误:无法将用户序列化到会话中。 错误的函数传递给serializeUser()?

我正在尝试使用Node的Express框架来完成我的第一步。 我试图使用Passport来实现一个很小的身份validation示例。 但是,我无法做到这一点。 我不断收到错误: Error: failed to serialize user into session

我安装了节点检查器,试图看看发生了什么事情。 显然,我的序列化函数正在被调用,它执行done(null, 0)正如所料。 我试着看看护照代码,但我不明白是什么问题。 这几乎是我第一次尝试Node应用程序,所以我不熟悉代码。 有人可以给我一个提示吗? 谢谢。

 var express = require('express'); var jade = require('jade'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var app = express(); /* * Settings */ app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.logger()); app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.session({ secret: 'cat in the bag' })); app.use(passport.initialize()); app.use(passport.session()); passport.use(new LocalStrategy( function(username, password, done) { done(null, { id: 0, username: 'juancito' }); } )); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { done(null, 'juancito'); }); }); /* * Routes */ app.get('/', function(req, res) { res.render('index', { title: 'Welcome!' }); }); app.get('/login', function(req, res) { if (req.user) return res.redirect('/'); res.render('login', { title: 'Log in' }); }); app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }) ); app.get('/logout', function(req, res) { req.logOut(); res.redirect('/'); }); app.listen(3000); console.log('Listening on port 3000.'); 

问题是, 0是JavaScript中的false-y值,所以Passport认为你没有序列化你的用户。

 done(null, 0) // don't serialize users to a 0 number 

我build议在1开始(这发生在SQL数据库)的用户ID,或者(如果你真的需要从0开始的整数)序列化为会话的string。

 done(null, 0.toString()) 

也许你应该在调用passport.initialize()和passport.session()之前分配你的serialize / deserializecallback。

 passport.use(new LocalStrategy( function(username, password, done) { done(null, { id: 0, username: 'juancito' }); } )); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { done(null, 'juancito'); }); app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.logger()); app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.session({ secret: 'cat in the bag' })); app.use(passport.initialize()); app.use(passport.session()); });