【问题标题】:NodeJS + ExpressJS + RedisStore Session is undefinedNodeJS + ExpressJS + RedisStore 会话未定义
【发布时间】:2014-01-12 05:23:08
【问题描述】:

我已经解决了很多关于同一问题的问题,但各种解决方案都没有帮助。我正在使用 Redis 在集群的 NodeJS+ExpressJS 应用程序中存储会话,但会话始终未定义。这是我的 Express 设置:

var express = require('express'),
    RedisStore = require('connect-redis')(express),
    Config = require('./config/config'),
    cluster = require("cluster"),
    QueryManager = require('./service/query_manager'),
    app = express();



// --- Index --- //
function renderSplash(req, res) {
    res.render(...);
}
function renderIndex(req, res) {
    res.render(...);
}

app.get('/', function(req, res) {
    if(req.session.user === null) {
        renderSplash(req, res);
    } else {
        renderIndex(req, res);
    }
});

// --- Configuration ---//
//EJS
app.engine('.html', require('ejs').__express);
app.set('view engine', 'html');
app.set('views', __dirname + '/public');

app.configure(function() {
    //Session
    app.use(express.cookieParser());
    app.use(express.session({
        store: new RedisStore({
            host: Config.redis.host,
            port: Config.redis.port
        }),
        secret: 'Its a secret.',
        cookie: { secure: true }
    }));    

    app.use(validateRequest); //Ensures we're at www. to hit the LB
    app.use(express.static(__dirname+'/public'));
    app.use(express.compress);
    app.use(app.router);
});

即使不使用 Redis 存储,我也会收到以下错误: TypeError: Cannot read property 'user' of undefined

【问题讨论】:

  • 你是否尝试过移动一些东西,比如在路由之前实例化会话,你是否在某处设置了 session.user ?
  • 我已经尝试过移动所有配置,但没有成功。而像req.session.user = "Hi"; 这样的操作会引发同样的错误,因为req.session 是未定义的。
  • @adeneo 哎呀,我读你的评论太快了。我没有尝试在路由之前配置会话,这是成功的。如果你把它写成我会接受的答案。谢谢!
  • 好的,添加了答案

标签: node.js session express redis


【解决方案1】:

您必须在路由之前实例化会话。

var express = require('express'),
    RedisStore = require('connect-redis')(express),
    Config = require('./config/config'),
    cluster = require("cluster"),
    QueryManager = require('./service/query_manager'),
    app = express();

app.use(express.cookieParser());
app.use(express.session({
    store: new RedisStore({
        host: Config.redis.host,
        port: Config.redis.port
    }),
    secret: 'Its a secret.',
    cookie: { secure: true }
}));    

// --- Index --- //
function renderSplash(req, res) {
    res.render(...);
}
function renderIndex(req, res) {
    res.render(...);
}

app.get('/', function(req, res) {
    if(req.session.user === null) {
        renderSplash(req, res);
    } else {
        renderIndex(req, res);
    }
});

【讨论】:

    猜你喜欢
    • 2013-12-13
    • 2016-10-31
    • 1970-01-01
    • 2023-03-14
    • 2018-05-29
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2013-07-10
    相关资源
    最近更新 更多