2012-10-03 19 views
5

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!") 
} 
+0

schlafen Sie diese Zeile haben dort zweimal in: app.use (express.session ({Speicher: session_store, Geheimnis: SESSION_SECRET, Schlüssel: "sid"})); – chovy

+0

Mein Fehler, ich habe den Code zweimal eingefügt (alle Zeilen waren zweimal dort) – Mamsaac

+0

hat das das Problem behoben? Ich sehe nicht, wo Sie req verwenden.Sitzung – chovy

Antwort

9

Wenn Sie eine Route definieren, wird der Router automatisch in die Mitte eingefügt Warestack ist zu der Zeit (nachfolgende Versuche, es absichtlich zu setzen, werden ignoriert). Sind Sie sicher, dass Sie keine Routen definieren, bevor Sie den Sitzungshandler festgelegt haben?

+0

Ja. Das ist eine Idee, die mir in den Sinn kam ... Also habe ich console.log direkt vor und nach dem Hinzufügen von Session-Middleware gesetzt, und auch vor und nach dem Hinzufügen von Routen und die Ausgabe kommt zuerst für die Session (aber vor und nach dem Hinzufügen) und dann für Routen . Ist es möglich, dass die Middleware-Bestellung durch eine meiner Aktionen zurückgesetzt wird? – Mamsaac

+0

Sie könnten versuchen, Ihren Aufruf von 'static' nach dem Aufruf von' router' zu verschieben. Ich bin nicht vertraut mit "i18next", also weiß ich nicht, ob das das Problem verursachen könnte. Sie könnten auch versuchen, 'errorhandler' an das Ende des Stapels zu verschieben; Es ist möglich, dass dort, wo es jetzt ist, ein Fehler fehlt, der von "Sitzung" herrührt. – ebohlman

+0

Ich habe i18next und errorhandler auskommentiert, ohne dass es behoben wurde. Ich bewegte statisch unter app.router (beachten Sie, dass ich statische für die Produktion deaktivieren, da ich Nginx dafür verwende) und immer noch nicht geholfen. Ich denke immer noch, du bist auf dem richtigen Weg, aber ich bin mir nicht sicher, wo ich es vermasselt habe :( – Mamsaac

3

Vergessen zu aktualisieren: Ebohlman setzte mich in die richtige Spur.

Es war i18next. Beim Aufruf einer der init-Methode werden Routen eingerichtet und app.router gezwungen, früher in den Handle-Stack zu gelangen. Mein schlechtes, ich habe nicht bemerkt, dass ein Teil des Codes mit dem App-Objekt interagiert hat und es tat. Es gab keine Möglichkeit, dass die Frage besser beantwortet werden konnte, als mit den Informationen, die ich gab, also markiere ich seine Antwort als richtig.

ich versuchen sollte, mehr V.v