我以前做過這個......我不明白我在做什麼錯的這個時候,但我一直在掙扎了幾個小時,現在考慮自己精神上受阻。對應的代碼:的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!")
}
你有這一行有兩次:app.use(express.session({店:session_store,祕密:SESSION_SECRET,鍵: 「SID」})); – chovy
我的不好,我粘貼了兩次代碼(所有行都在那裏兩次) – Mamsaac
是否解決了這個問題?我沒有看到你使用req的地方。session – chovy