2012-02-26 4 views
10

He intentado utilizar la persistencia de sesión estándar con Redis en NodeJS:Redis nodejs conectan ID de sesión se regenera cuando debería permanecer persistido

var express = require('express'); 
var RedisStore = require('connect-redis')(express); 
var app = module.exports = express.createServer(); 

// Configuration 

app.configure(function(){ 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ 
    secret: "keyboard cat", 
    store: new RedisStore, 
    key: 'sid' 
    })); 
}); 


app.get('/', function (req, res) { 
    if (req.session.isValid) { 
    console.log("There is an existing session."); 
    } 
    else { 
    req.session.isValid = true; 
    console.log("New session."); 
    console.log('Old session ID: ' + req.header('Cookie')); 
    console.log('New session ID: ' + req.session.id); 
    } 

    res.render('index', {'title': s}); 
}); 
app.listen(4000); 

En teoría debería ver la línea "Nueva sesión". una vez y todas las llamadas posteriores del sitio web deberían llevar a "Hay una sesión existente". Desafortunadamente en cada llamada se regenera una nueva ID de sesión. La cookie en el navegador está trabajando muy bien, el contenido se transmite correctamente y puedo verlo en

req.header('Cookie') 

Esto es lo que ve el registro de la consola como:

[app.js] New session. 
[app.js] Old session ID: undefined 
[app.js] New session ID: nuoHKZj2j0AoRkvqT4xE5h6W.zF+DNv2rzr3kpeO2IyD7sa4xdamFQMugjfQvY6OYymE 
[app.js] New session. 
[app.js] Old session ID: sid=neLUc5PXxPoj1yFqukerv49x.BHzYKiuAfFSNHKd4fCAkv8wNwZO%2FxykJPN5R5tjAlQc 
[app.js] New session ID: FvuzjnXvchCkmVqsq5mrodL2.5YlT3InfTbvOwEUc0dNpPLT77tcdJpNuhbFGVYkLneQ 
[app.js] New session. 
[app.js] Old session ID: sid=pFbyVdlNZXtF5vZ35CW9sfmq.nJ1RBjJu59iUJJjmZv9TCYiYLcvycme%2BJh8sQC6%2FzEE 
[app.js] New session ID: KdPhwqwwgmOnPZEuVapy7EJe.I0TGT9HSSQQSporwCNsxl11rXDxR/ysjTeZb0lD5uwI 

Al mismo tiempo me da la siguiente resultado cuando se ejecuta el comando "MONITOR" en Redis-cli:

sess:nuoHKZj2j0AoRkvqT4xE5h6W.zF+DNv2rzr3kpeO2IyD7sa4xdamFQMugjfQvY6OYymE 
*2 
$3 
get 
$73 
sess:Q6Z06GL4hdRytKA2MToCIgVw.JWxImSB/m20Urn+IYMQqnNqfQp4ygAESiyBLORn3Iuo 
*2 
$3 
get 
$73 
sess:neLUc5PXxPoj1yFqukerv49x.BHzYKiuAfFSNHKd4fCAkv8wNwZO/xykJPN5R5tjAlQc 
*2 
$3 
get 
$73 
sess:FvuzjnXvchCkmVqsq5mrodL2.5YlT3InfTbvOwEUc0dNpPLT77tcdJpNuhbFGVYkLneQ 
*2 
$3 
get 
$73 
sess:zvCWdwzowgAfl6jH8m0D31vL.b5tK5VZUJtPHrdvH09A/hjhjoOg6bT0CmAcWWRf99SI 
*2 
$3 
get 
$73 
sess:pFbyVdlNZXtF5vZ35CW9sfmq.nJ1RBjJu59iUJJjmZv9TCYiYLcvycme+Jh8sQC6/zEE 
*2 
$3 
get 
$73 
sess:KdPhwqwwgmOnPZEuVapy7EJe.I0TGT9HSSQQSporwCNsxl11rXDxR/ysjTeZb0lD5uwI 
*2 
$3 
get 
$73 
sess:r793eaJyOnaq2RNyw1Hmpuwv.xnonbOlaWEAlpz+LDg0SHcUeAa0sbjyw0oIcwFmlX0w 

cuando uso MemoryStore insteand de RedisStore, todo funciona como espera.

¿Alguna idea?

+0

HI Raph: ¿has resuelto esto? Estoy teniendo el mismo problema:/ – UpTheCreek

+0

Parece que la actualización a una versión más nueva de Redis hizo el truco. Pero todavía no sé de dónde vino el problema. – Raph

Respuesta

0

Tuve un problema similar. Mi sesión se regeneró en cada solicitud. Lo resolví estableciendo la fecha correcta en la máquina virtual donde se desarrolla el desarrollo.

+0

¿Quiere decir que hubo una fecha diferente entre la VM de la aplicación y la VM de Redis? ¿Qué tan grande fue la discrepancia? – UpTheCreek

-1

Tuve el mismo problema cuando las sesiones se regeneraron en cada solicitud. La razón fue que el middleware 'estático' se colocó debajo de 'sesión'. Por lo tanto, asegúrese de colocar middleware en el orden correcto, es decir:

... 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(express.session({ store: new RedisStore({ prefix: 'sid_' }) })); 
app.use(app.router) 
app.get ... 

middleware 'express.session' debe estar bajo 'estático'.

Cuestiones relacionadas