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!")
}
que tiene esta línea en allí dos veces: app.use (express.session ({tienda: session_store, secreta: SESSION_SECRET, clave: "SID"})); – chovy
Mi mal, pegué el código dos veces (todas las líneas fueron dos veces allí) – Mamsaac
¿Eso solucionó el problema? No veo dónde estás usando req.sesión – chovy