2012-10-03 26 views
5

He hecho esto antes ... No sigo lo que estoy haciendo mal esta vez, pero he estado luchando por un par de horas y ahora me considero mentalmente bloqueado. El código correspondiente: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); 

Luego, cuando el manejo de solicitudes, aquí es sólo un ejemplo:

app.get('/session_test', function (req, res, next) { 
    console.log(req.session); //undefined 
}); 

conexión a Redis está trabajando muy bien. No se muestran errores Luego, cuando intenta acceder desde la solicitud, la sesión de solicitud no está definida. El navegador está enviando el sid correcto.

No soy experto en el flujo exacto que se produce durante la solicitud, pero después de la depuración, parece que se llamó al enrutador antes del middleware de sesión.

Gracias de antemano por cualquier ayuda. Proporcionaré cualquier código que pueda, no estoy seguro de qué podría ser de tu ayuda.

Aquí hay más código. 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); 

No hay rutas se añaden hasta routes.settings.setup se llama. la configuración (que es la configuración global) es un archivo bastante grande. Ahí es donde se hace toda la configuración. La configuración no se agrega hasta que se llama también al método settings.setup. Aquí hay una penetración de la lima:

//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 
    } 
} 

He dividido 25 rutas en 4 archivos diferentes (de alguna manera yo no tenía una necesidad de sesión hasta ahora, ya que estaba retrasando algunas partes y todo lo necesario estaba hecho con Mangosta) Aquí está un ejemplo de cómo se está haciendo (con nombres falsos):

rutas/index.js

export.settings = require("./settings"); 

rutas/settings.js

exports.setup = function (app_settings) { 
    require("./route1")(app_settings); 
    require("./route2")(app_settings); 
    require("./route3")(app_settings); 
}; 

Aquí hay una despojado "Route1" file ("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

que tiene esta línea en allí dos veces: app.use (express.session ({tienda: session_store, secreta: SESSION_SECRET, clave: "SID"})); – chovy

+0

Mi mal, pegué el código dos veces (todas las líneas fueron dos veces allí) – Mamsaac

+0

¿Eso solucionó el problema? No veo dónde estás usando req.sesión – chovy

Respuesta

9

Siempre que defina una ruta, el enrutador se inserta automáticamente en cualquier punto intermedio la pila de cerámica está en el momento (se ignorarán los intentos subsiguientes de insertarla deliberadamente). ¿Estás seguro de que no estás definiendo ninguna ruta antes de configurar el manejador de sesión?

+0

Sí. Esa es una idea que cruzó mi mente ... Así que puse console.log justo antes y después de agregar el middleware de sesión, y también antes y después de agregar rutas y la salida es lo primero para la sesión (pero antes y después de agregar) y luego para las rutas . ¿Es posible que el orden del middleware sea restablecido por alguna acción mía? – Mamsaac

+0

Puede intentar mover su invocación de 'static' después de la invocación de' router'. No estoy familiarizado con 'i18next' así que no sé si eso podría estar causando el problema. También puede intentar mover 'errorhandler' al final de la pila; es posible que donde está ahora, falte un error que se origine en 'sesión '. – ebohlman

+0

Comenté i18next y errorhandler sin que se solucionara. Moví la estática debajo de app.router (note que deshabilito la estática para la producción, ya que uso nginx para eso) y todavía no me ayudó. Todavía creo que estás en el camino correcto, pero no estoy seguro de dónde lo arruiné :( – Mamsaac

3

Olvidé actualizar esto: Ebohlman me puso en el camino correcto.

Era i18next. Cuando se llama al método init, se configuran las rutas y se forzaba a la aplicación.router a forzarse en la pila del identificador antes. Mi mal, no me di cuenta de que parte del código estaba interactuando con el objeto de la aplicación y lo hizo. No hubo forma de que la pregunta pudiera haber sido respondida mejor que cómo lo hizo con la información que di, así que estoy marcando su respuesta como correcta.

que debería intentar dormir más v.v

Cuestiones relacionadas