Ich habe das schon mal gemacht ... Ich folge nicht, was ich diesmal falsch mache, aber ich habe ein paar Stunden gekämpft und denke jetzt über mich nach geistig blockiert. Der entsprechende Code: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);
Dann, wenn Anfragen Handhabung, hier ist nur ein Beispiel:
app.get('/session_test', function (req, res, next) {
console.log(req.session); //undefined
});
Anschluss an Redis arbeitet gut. Es werden keine Fehler angezeigt. Wenn dann versucht wird, über die Anforderung auf sie zuzugreifen, ist die Anforderung sq.session nicht definiert. Der Browser sendet die richtige SID.
Ich bin kein Experte für den genauen Ablauf, der während der Anfrage auftritt, aber nach dem Debuggen scheint es, als ob der Router vor der Sitzung Middleware aufgerufen wurde.
Vielen Dank im Voraus für jede mögliche Hilfe. Ich werde jeden Code zur Verfügung stellen, den ich kann, ich bin mir nicht sicher, was Ihre Hilfe sein könnte.
Hier ist mehr Code. 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);
Keine Routen werden hinzugefügt, bis routes.settings.setup genannt wird. Einstellungen (das ist die globale Einstellungen) ist eine ziemlich große Datei. Dort wird die gesamte Konfiguration vorgenommen. Einstellungen werden erst hinzugefügt, wenn auch die settings.setup-Methode aufgerufen wird. Hier ist ein Ausschnitt der Datei:
//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
}
}
Ich habe 25 Routen in 4 verschiedenen Dateien aufgeteilt (irgendwie habe ich keine Notwendigkeit Sitzung, bis jetzt habe, da ich einige Teile wurde verzögert und alles, was benötigt wurde mit Mongoose getan). Hier ist ein Beispiel dafür, wie es getan wird (mit falschen Namen):
Routen/index.js
export.settings = require("./settings");
Routen/settings.js
exports.setup = function (app_settings) {
require("./route1")(app_settings);
require("./route2")(app_settings);
require("./route3")(app_settings);
};
Hier ist ein gezupft "route1" Datei ("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!")
}
schlafen Sie diese Zeile haben dort zweimal in: app.use (express.session ({Speicher: session_store, Geheimnis: SESSION_SECRET, Schlüssel: "sid"})); – chovy
Mein Fehler, ich habe den Code zweimal eingefügt (alle Zeilen waren zweimal dort) – Mamsaac
hat das das Problem behoben? Ich sehe nicht, wo Sie req verwenden.Sitzung – chovy