Tôi đã làm điều này trước đây ... Tôi không làm theo những gì tôi đang làm sai thời gian này, nhưng tôi đã đấu tranh cho một vài giờ và bây giờ xem xét bản thân mình bị chặn về tinh thần. Mã tương ứng:Nodejs: Express + RedisStore, req.session undefined
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);
Sau đó, khi xử lý yêu cầu, đây chỉ là một ví dụ:
app.get('/session_test', function (req, res, next) {
console.log(req.session); //undefined
});
Kết nối với redis đang làm việc tốt. Không có lỗi nào được hiển thị. Sau đó, khi cố gắng truy cập nó từ yêu cầu, req.session là không xác định. Trình duyệt đang gửi đúng sid.
Tôi không có chuyên gia về luồng chính xác xảy ra trong khi yêu cầu, nhưng sau khi gỡ lỗi, có vẻ như bộ định tuyến đã được gọi trước phần mềm trung gian phiên.
Cảm ơn trước vì bất kỳ và tất cả sự trợ giúp có khả năng. Tôi sẽ cung cấp bất kỳ mã nào tôi có thể, tôi không chắc chắn những gì có thể là sự giúp đỡ của bạn.
Đây là mã khác. 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);
Không có tuyến đường nào được thêm cho đến khi routes.settings.setup được gọi. cài đặt (là cài đặt chung) là một tệp khá lớn. Đó là nơi tất cả các cấu hình được thực hiện. Cài đặt không được thêm cho đến khi phương thức settings.setup cũng được gọi. Dưới đây là một vết cắt của tập tin:
//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
}
}
Tôi đã 25 tuyến đường chia làm 4 file khác nhau (bằng cách nào đó tôi không có nhu cầu cho phiên đến nay, kể từ khi tôi đã trì hoãn một số bộ phận và mọi thứ cần thiết đã được thực hiện với Mongoose). Dưới đây là một ví dụ về cách nó đang được thực hiện (với tên giả):
tuyến/index.js
export.settings = require("./settings");
tuyến/settings.js
exports.setup = function (app_settings) {
require("./route1")(app_settings);
require("./route2")(app_settings);
require("./route3")(app_settings);
};
Dưới đây là một tước ra "route1" tệp ("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!")
}
bạn có dòng này trong đó hai lần: app.use (express.session ({cửa hàng: session_store, bí mật: SESSION_SECRET, chìa khóa: "sid"})); – chovy
Tệ của tôi, tôi dán mã hai lần (tất cả các dòng đều hai lần trong đó) – Mamsaac
đã khắc phục được sự cố chưa? Tôi không thấy nơi bạn đang sử dụng req.phiên – chovy