Node.js 错误:无法将用户序列化到会话中。传递给serializeUser()的函数错误?
我正在尝试使用节点的Express framework执行我的第一步。我试图用Passport实现一个小小的身份验证示例。然而,我不能让它工作;我不断收到错误:Node.js 错误:无法将用户序列化到会话中。传递给serializeUser()的函数错误?,node.js,express,passport.js,Node.js,Express,Passport.js,我正在尝试使用节点的Express framework执行我的第一步。我试图用Passport实现一个小小的身份验证示例。然而,我不能让它工作;我不断收到错误:错误:无法将用户序列化到会话中 我安装了节点检查器以尝试查看发生了什么。显然,我的序列化函数正在被调用,它按预期执行done(null,0)。我试着看一下护照代码,但我不明白问题出在哪里。这几乎是我第一次尝试使用节点应用程序,所以我不熟悉代码。有人能给我一个提示吗?谢谢 var express = require('express');
错误:无法将用户序列化到会话中
我安装了节点检查器以尝试查看发生了什么。显然,我的序列化函数正在被调用,它按预期执行done(null,0)
。我试着看一下护照代码,但我不明白问题出在哪里。这几乎是我第一次尝试使用节点应用程序,所以我不熟悉代码。有人能给我一个提示吗?谢谢
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.');
也许在调用passport.initialize()和passport.session()之前,您应该分配序列化/反序列化回调
问题是
0
在JavaScript中是一个假y值,所以Passport认为您没有序列化您的用户
done(null, 0) // don't serialize users to a 0 number
我建议在1处启动用户ID(发生在SQL数据库中),或者(如果确实需要从0开始的整数)将它们序列化为会话的字符串
done(null, 0.toString())
谢谢你,杰瑞德!你是对的。因此,1、2、3是对象的有效序列化,但0不是,因为语言认为0是错误的值。这不是库中的一个bug吗?是的,请随意在GitHub上提交一个问题。只有在尝试访问从数据库还原会话的页面后,才会出现此错误。因为我只有在服务器处理第一次登录后才设置了序列化/反序列化。这对我来说没有什么区别。因为这是一个常见症状,但这是一个奇怪的原因(id==0)。我的ID(和大多数人的ID一样)都是非0的,我仍然会遇到这个错误。
done(null, 0.toString())