req.session经常在路径中未定义(connect-redis用作商店)

时间:2014-02-08 12:45:36

标签: node.js session express connect passport.js

问题如下:在部署的nodejitsu应用程序上,经常(并非总是!),当我从浏览器(点击aa href =“/ logout”)重定向到/ logout路由时,我得到一个req。会话在该路线中未定义。

app.get('/logout', function(req, res){
   log.debug("session", req.session); //undefined
});

请求通过以下“中间件”堆栈:

var store = new db.store({client: db.client}); // no problems here, redis monitor confirms
app.configure(function(){
    [...]
    app.use(express.cookieParser("XXXpassXXX"));
    app.use(express.bodyParser());
    app.use(express.session({
        secret: "XXXpassXXX",
        store: store
    }));
    app.use(function(req, res, next) {
        var fullURL = req.protocol + "://" + req.get('host') + req.url;
        if (fullURL.indexOf("logout") != -1 || fullURL[fullURL.length-1] == "/") {
            log.debug(fullURL);
            log.debug("sesiune", JSON.stringify(req.session)); // undefined for the "/logout" route !!!
            log.debug("cookies", JSON.stringify(req.cookies));
        }
        next();
    });
    app.use(passport.session());
    app.use(app.router);
});

我检查了浏览器并将cookie发送到服务器,在我的“logger”中间件中,我可以看到fullURL已正确设置。

此外,应用程序在失败之前对redis db进行的最后一次查询是对正确的会话ID(正确存储在数据库中)获取“sess:xxx”。

为什么以及可能的原因是,在使用connect-redis作为商店提交到next()中间件之后的express.session()之后,req.session是未定义的,因为会话存储在redis数据库并且它会对它执行“获取”吗?

PS:在本地服务器上,使用本地redis实例,一切正常。

1 个答案:

答案 0 :(得分:3)

看起来你做的一切都是正确的,所以我担心我没有直接回答你。但是,我希望这可以帮助您调试问题。

我要做的第一件事是查看会话中间件中的各种故障情况,看看它们中是否存在任何问题。该代码位于您的项目目录中:

node_modules/express/node_modules/connect/middleware/session.js

查找以function session(options){开头的行;那是党开始的地方。大约25行之后,你会看到return function session(req, res, next){;这是实际的中间件。如果浏览该源,您将看到可能未设置session变量的各种原因(抛出错误或返回next()的任何内容)。例如,商店可以断开连接,或者路径名不匹配。有时,debug()会在失败时调用,因此您可以尝试启用调试日志记录。只需将环境变量DEBUG设置为express:*即可。我还没有使用过Nodejitsu,但我确信你可以设置环境变量并检查日志。

如果你可以在Nodejitsu上启用远程调试,那就更好了:这样你就可以逐步浏览session中间件,找出它失败的地方(或者由于某些原因它没有被调用)。我查看了公共Nodejitsu文档,并没有看到任何有关远程调试的信息,但这并不意味着它无法完成。