2011-03-12 23 views
19

Tengo un sistema de autenticación/inicio de sesión de usuario totalmente funcional usando Express y Connect middleware.El reinicio del servidor Node.js suelta las sesiones

app.use(express.session({store: require('connect').session.MemoryStore({reapInterval: 60000 * 10}) })) 

El único problema es que las sesiones caen cada vez que realiza el reinicio del servidor.

https://github.com/remy/nodemon - y nodemon reinicia node.js cada vez que detecta un cambio de archivo.

¿Cómo puedo tener sesiones persistentes?

+0

Me pregunto cómo tener sesiones persistentes utilizando JWT en lugar de utilizar una base de datos ... ?? –

Respuesta

23

Al igual que su código indica que está utilizando MemoryStore. Esto es volátil y se borra al reiniciar. Le aconsejo que use connect_redis para conservar su sesión. Redis es una tienda extremadamente rápida.

  1. Descargar redis
  2. Redis de compilación: servidor make
  3. de inicio: ./redis-server
  4. npm install connect-redis
  5.  

    var connect = require('connect') , RedisStore = require('connect-redis'); 
    
    connect.createServer(
        connect.cookieParser(), 
        // 5 minutes 
        connect.session({ store: new RedisStore }) 
    ); 
    

Esto es solo para comenzar rápidamente. Debería leer la documentación y configurar el redis si quiere sacar el máximo provecho de redis.

+3

a partir de connect 1.0 cookieDecoder() ahora es cookieParser() – realgt

+0

curiosidad por qué usa ProperCase para RedisStore, ¿hay alguna razón/convención NodeJS para esto? –

+0

@ClarenceLiu Los nombres de las clases a menudo se eligen como ProperCase (o CamelCase o como se quiera llamar). – Domi

1

Cuando el nodo muere me imagino que el almacén de memoria que está utilizando se muere.

¿Persistir las sesiones en el disco?

+3

como redis maneja la sesión en un proceso adicional la sesión sobrevive bloqueos de nodos y reinicios de nodos, si redis baja, las sesiones disminuyen según corresponda – ezmilhouse

5

también, si está utilizando Express, debe proporcionar un secreto al decirle a la aplicación que use el middleware redis.

, siga la receta de Alfred anterior, pero haga lo siguiente ...

var express = require('express'); 
var RedisStore = require('connect-redis'); 

app.use(express.cookieParser()); 
app.use(express.session({ secret: "keyboard cat", store: new RedisStore })); 
+0

Ahora necesita agregar require ('connect-redis') (express) - de lo contrario obtendrá un TypeError: no se puede leer la propiedad 'session' de undefined. (https://github.com/visionmedia/connect-redis/issues/24) –

14

yo estaba tratando de llegar a la pista Redis usando express.js, Google me envió aquí. La implementación expresa ha cambiado:

var express = require('express'), 
RedisStore = require('connect-redis')(express); 

Otra cosa importante es el orden de las configuraciones expresas.

app.configure(function(){ 

    app.enable('strict routing'); // removes trailing slash 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jqtpl'); 
    app.register('.html', require('jqtpl').express); 
    app.use(express.favicon()); 
    app.use(express.methodOverride()); 
    app.use(express.compiler({src: __dirname + '/public', enable: ['sass']})); 
    app.use(express.static(__dirname + '/public')); 
    app.use(app.router); 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({secret: _.config.secret, store: new RedisStore})); 

}); 

cookieParser & configuraciones de sesión necesitan estar al final de las configuraciones, y cookieParser deben colocarse justo antes express.session.

Espero que ayude, me encontré con ambos problemas.

Cuestiones relacionadas