【问题标题】:req.session often undefined in a route (connect-redis used as store)req.session 通常在路由中未定义(connect-redis 用作存储)
【发布时间】:2014-03-05 22:47:25
【问题描述】:

问题如下:在部署的 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 发送到服务器,在我的“记录器”中间件中,我可以看到 fullURL 设置正确。

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

在 express.session() 使用 connect-redis 作为存储提交到 next() 中间件之后,鉴于 session 存储在redis 数据库并对其执行“获取”?

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

【问题讨论】:

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


    【解决方案1】:

    看起来你做的一切都是正确的,所以恐怕我没有直接的答案给你。不过,我希望这能帮助您调试问题。

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

    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 文档,并没有看到任何有关远程调试的信息,但这并不意味着它不能完成。

    【讨论】:

      猜你喜欢
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2016-09-28
      • 1970-01-01
      • 2020-08-16
      • 2014-08-20
      • 1970-01-01
      相关资源
      最近更新 更多