Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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 错误:无法将用户序列化到会话中。传递给serializeUser()的函数错误?_Node.js_Express_Passport.js - Fatal编程技术网

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

Node.js 错误:无法将用户序列化到会话中。传递给serializeUser()的函数错误?,node.js,express,passport.js,Node.js,Express,Passport.js,我正在尝试使用节点的Express framework执行我的第一步。我试图用Passport实现一个小小的身份验证示例。然而,我不能让它工作;我不断收到错误:错误:无法将用户序列化到会话中 我安装了节点检查器以尝试查看发生了什么。显然,我的序列化函数正在被调用,它按预期执行done(null,0)。我试着看一下护照代码,但我不明白问题出在哪里。这几乎是我第一次尝试使用节点应用程序,所以我不熟悉代码。有人能给我一个提示吗?谢谢 var express = require('express');

我正在尝试使用节点的Express framework执行我的第一步。我试图用Passport实现一个小小的身份验证示例。然而,我不能让它工作;我不断收到错误:
错误:无法将用户序列化到会话中

我安装了节点检查器以尝试查看发生了什么。显然,我的序列化函数正在被调用,它按预期执行
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())