2012-10-03 52 views
5

我以前做过这个......我不明白我在做什么错的这个时候,但我一直在挣扎了几个小时,现在考虑自己精神上受阻。对应的代码:的NodeJS:快递+ 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。

我在该请求期间发生的确切流量不是专家,但调试完毕后,它好像路由器在会话中间件之前被调用。

预先感谢任何及所有可能的帮助。我会提供任何我可以的代码,我不确定可能有什么帮助。

这里有更多的代码。 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); 

没有路由添加到routes.settings.setup被调用。设置(这是全局设置)是一个非常大的文件。这就是所有配置完成的地方。除非调用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页不同的文件(不知何故,我没有必要为会议到现在为止,因为我将推迟一些地方和所需的一切都与猫鼬做)。下面是它是如何正在做一个例子(用假名字):

路线/ 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); 
}; 

这里有一个剥离出来 “路径1”文件(“路线/ 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!") 
} 
+0

你有这一行有两次:app.use(express.session({店:session_store,秘密:SESSION_SECRET,键: “SID”})); – chovy

+0

我的不好,我粘贴了两次代码(所有行都在那里两次) – Mamsaac

+0

是否解决了这个问题?我没有看到你使用req的地方。session – chovy

回答

9

无论何时定义的路由,路由器就会自动插入任何中间ware堆栈在那个时候(后来有意插入它的尝试将被忽略)。在设置会话处理程序之前,您确定没有定义任何路线吗?

+0

是的。这是一个让我想起来的想法......所以我在添加会话中间件之前和之后添加console.log,并且在添加路由之前和之后,输出会首先出现在会话中(但在添加之前和之后),然后是路由。中间件订单是否可能通过我的某些操作重置? – Mamsaac

+0

你可以尝试在调用'router'之后调用'static'的调用。我不熟悉'i18next',所以我不知道这是否会导致问题。您也可以尝试将'errorhandler'移动到堆栈的末尾;它可能在现在的位置,它缺少源于'session'的错误。 – ebohlman

+0

我注意到i18next和errorhandler没有修复。我将静态移动到app.router下面(注意我禁用静态生产,因为我使用nginx)并且仍然没有帮助。我仍然认为你在正确的轨道上,但我不知道我搞砸了什么:( – Mamsaac

3

忘了更新的:Ebohlman设置我在正确的轨道上。

这是i18next。当调用其中一个init方法时,它会设置路由,并迫使app.router更早地被强制进入句柄堆栈。我的坏,我没有意识到代码的一部分是与应用程序对象交互,它确实。 这个问题没有办法得到比他给我的信息更好的回答,所以我把他的回答标为正确。

我应该试睡更v.v