Nodejs:Express + RedisStore,req.session未定义

我之前做过这个…我没有按照我这次做错的方式去做,但是我一直在挣扎几个小时,现在认为自己被精神上阻塞了。 相应的代码:

app.use(express.bodyParser()); app.use(i18next.handle); app.use(express.methodOverride()); app.use(express.static(__dirname + '/public')); app.set('views', __dirname + '/views'); app.set('view engine', 'swig'); app.set('view cache', false); var session_store = new RedisStore({ client : redis_client}); app.use(express.errorHandler({ dumpExceptions : true, showStack : true})); app.use(express.cookieParser()); app.use(express.session({ store : session_store, secret : SESSION_SECRET, key : "sid" })); app.use(app.router); 

然后在处理请求时,这里只是一个例子:

 app.get('/session_test', function (req, res, next) { console.log(req.session); //undefined }); 

与Redis的连接工作得很好。 没有错误显示。 然后,当试图从请求访问它时,req.session是未定义的。 浏览器正在发送正确的sid。

我不是在请求期间发生的确切stream程的专家,但在debugging之后,似乎路由器在会话中间件之前被调用。

提前感谢任何和所有可能的帮助。 我会提供任何代码,我不确定什么可能是你的帮助。

这是更多的代码。 server.js

  //Dependency modules var express = require('express'), app = express.createServer(), //Application dependency modules settings = require('./settings'), //app settings routes = require('./routes'), //http routes rtroutes = require('./rtroutes'); //real time communication routes (io) var io = require('socket.io').listen(app); var appWithSettings = settings.setup(io, app); routes.settings.setup(appWithSettings); rtroutes.settings.setup(io, appWithSettings); 

route.settings.setup被调用之前,没有路由被添加。 设置(这是全局设置)是一个非常大的文件。 这就是所有configuration完成的地方。 在调用settings.setup方法之前,不会添加设置。 下面是该文件的一部分:

 //Dependency modules var express = require('express'), redis = require('redis'), //Important configuration values var SESSION_SECRET = 'some secret thing which doesnt belong to stackoverflow!', insert_other_variables_here = "lalala"; //Computed general objects var RedisStore = require('connect-redis')(express), redis_client = redis.createClient(REDIS_PORT, REDIS_HOST); exports.setup = function (io, app) { app.configure(function () { app.use(express.bodyParser()); app.use(i18next.handle); app.use(express.methodOverride()); app.use(express.static(__dirname + '/public')); app.set('views', __dirname + '/views'); app.set('view engine', 'swig'); app.set('view cache', false); var session_store = new RedisStore({ client : redis_client}); app.use(express.errorHandler({ dumpExceptions : true, showStack : true})); app.use(express.cookieParser()); console.log("ABOUT TO ADD SESSION STORE MIDDLEWARE"); app.use(express.session({ store : session_store, secret : SESSION_SECRET, key : "sid" })); console.log("AND NOW ADDED THE SESSION STORE MIDDLEWARE"); app.use(app.router); }); app.configure('development', function () { //some things in here, but nothing that affects app. I have commented this //for debugging and it changed nothing }); app.configure('production', function () { //mostly configuration for io and some caching layers, as well as servers info app.use(express.errorHandler()); app.use(express.logger({ stream : logFile })); }); app.listen(WEB_PORT); return { app : app, //some other stuff that isn't relevant } } 

我有25条路线分成4个不同的文件(不知何故,直到现在我还没有需要进行会话,因为我拖延了一些部分,所有需要的都是用Mongoose完成的)。 下面是一个如何完成的例子(假名):

路线/ index.js

 export.settings = require("./settings"); 

路线/ settings.js

 exports.setup = function (app_settings) { require("./route1")(app_settings); require("./route2")(app_settings); require("./route3")(app_settings); }; 

这是一个剥离的“route1”文件(“routes / route1.js”):

 module.exports = function (app_settings) { var app = app_settings.app; console.log("ABOUT TO ADD ROUTES") app.get("/signin", function (req, res, next) { console.log(req.session); //this will be undefined }); app.get("/register", function (req, res, next) { }); app.get('/language', function (req, res, next) { }); app.post('/settings', function (req, res, next) { }); console.log("ADDED ROUTES NOW!") } 

无论何时定义路由,路由器都会自动插入到中间件堆栈中(后续尝试故意插入它的操作将被忽略)。 你确定你没有定义任何路线,然后再设置会话处理程序?

忘了更新这个:Ebohlman让我走在正确的轨道上。

这是i18next。 当调用其中一个init方法时,它build立了路由,并迫使app.router被迫更早地进入句柄栈。 我的坏,我没有意识到部分代码是与应用程序对象交互,它没有。 这个问题不可能比他给我提供的信息做得更好,所以我把他的答案标为正确。

我应该尝试睡更多的vv