【问题标题】:'session' is undefined when using express / redis for session store使用 express / redis 进行会话存储时,“会话”未定义
【发布时间】:2012-04-28 19:40:37
【问题描述】:

我正在尝试在我的 express 应用程序中使用 redis 进行会话。

我执行以下操作:

var express = require('express');
var RedisStore = require('connect-redis')(express);

app.configure('development', function(){     
    app.use(express.session({ secret: "password", 
                            store: new RedisStore({
                                          host: "127.0.0.1",
                                          port: "6379",
                                          db: "mydb"
                                        })  
          }));

稍后,在我的应用中,如果我执行以下操作:

var whatever = req.session.someProperty;

我明白了:

无法读取未定义的属性“someProperty”

这表示 req.session 未定义 (我可以从我的配置部分的 console.log 条目中看到这一点)

我肯定已经运行了 redis,并且可以看到我的应用最初连接到它(使用 redis-cli 监视器)

【问题讨论】:

    标签: session node.js redis express


    【解决方案1】:

    除非您按以下顺序拥有这 3 个,否则会话将无法工作:

    app.use(express.cookieParser());
    app.use(express.session());
    app.use(app.router);
    

    我不确定路由器是否必须使用会话,但如果将它放在它们之前会破坏它们。

    【讨论】:

    • 我有 app.use(app.router);在 express.session 之前,这似乎打破了它。
    • 这个答案很难找到,应该在文档的某个地方。点赞!
    • 这个答案比较完整。你需要做两件事:1)启用cookieParser()和2)移动'app.use(app.router);'至底部。我认为这应该是正确的答案。
    • 即使所有 3 件事都按正确的顺序排列,req.session 仍然未定义,不知道为什么。
    • 自 1.5.0 版以来此答案将如何更新?目前,express-session 是一个单独的模块。根据文档,“cookie-parser 中间件不再需要用于此模块的工作”
    【解决方案2】:

    看来你不见了:

    app.use(express.cookieParser());
    

    在您拨打app.use(express.session(...)); 之前。

    here

    【讨论】:

    • 我也有同样的问题,但我确实有 app.user(cookieParser()) 的东西
    【解决方案3】:

    遇到了同样的问题,但这是由于最新版本的 express 更改引起的。

    您现在需要将 express-session 传递给函数 connect-redis 导出以扩展 session.Store:

    var express = require('express');
    var session = require('express-session')
    var RedisStore = require('connect-redis')(session);
    

    【讨论】:

      【解决方案4】:

      最近 Express 3 / Express 4 发生了变化。 请确认您使用的是 4 版本。

      完整的中间件概念发生了变化。您需要手动安装这些中间件。 “express-session”是 4.0 中间件之一。

      推荐阅读

      http://scotch.io/bar-talk/expressjs-4-0-new-features-and-upgrading-from-3-0https://github.com/visionmedia/express/wiki/Migrating-from-3.x-to-4.x

      此外,一些用户对 github repo 本身只是命名为“会话”感到困惑,但是

      npm install express-session
      

      是正确的。

      【讨论】:

      【解决方案5】:

      我遇到了同样的问题。原来redis只是简单的配置到了不同的端口。

      【讨论】:

      • 感谢您让我走上正轨。我绊倒了 Heroku 更改了我在本地主机上使用的 REDIS_URL 的事实。当他们自己提到这一点时,我本可以知道这一点:>“REDIS 配置变量可能随时更改。依赖 Heroku 应用程序之外的配置变量可能会导致您必须重新复制该值,如果它发生变化”@987654321 @
      猜你喜欢
      • 2016-09-07
      • 2013-12-13
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2014-04-03
      • 1970-01-01
      相关资源
      最近更新 更多