问题如下:在部署的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发送到服务器,在我的“logger”中间件中,我可以看到fullURL已正确设置。
此外,应用程序在失败之前对redis db进行的最后一次查询是对正确的会话ID(正确存储在数据库中)获取“sess:xxx”。
为什么以及可能的原因是,在使用connect-redis作为商店提交到next()中间件之后的express.session()之后,req.session是未定义的,因为会话存储在redis数据库并且它会对它执行“获取”吗?
PS:在本地服务器上,使用本地redis实例,一切正常。
答案 0 :(得分:3)
看起来你做的一切都是正确的,所以我担心我没有直接回答你。但是,我希望这可以帮助您调试问题。
我要做的第一件事是查看会话中间件中的各种故障情况,看看它们中是否存在任何问题。该代码位于您的项目目录中:
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文档,并没有看到任何有关远程调试的信息,但这并不意味着它无法完成。