2012-10-05 54 views
6

primer problema
que estoy tratando de averiguar sesiones, tiendas, autorización y Redis. Si es importante, estoy usando [email protected]. Entiendo que tengo dos opciones para poner mi RedisStore(). ¿Cuál uso? ¿Uso ambos?En node.js, ¿cómo configuro el redis con socket.io y express? En concreto utilizando RedisStore()

express.session({secret: 'secret', key: 'key', store: new RedisStore()}); 
io.set('store', new RedisStore()); 

que ya tienen node.js, express y socket.io corriendo. Así que ahora estoy tratando de implementar redis, pero no sé cómo implementar la autorización utilizando sesiones/tiendas y no sé cómo escribir en la base de datos redis. No he encontrado ninguna documentación sobre esto. Encontré un sitio que habla sobre sesiones y tiendas usando socket.io and express pero no redis, y otro que habla sobre sesiones y almacena using all three, pero no usa io.set('store', ...).

Tampoco sé si debería usar dos tiendas diferentes, una para express y otra para socket.io, o si solo debo usar una. Mira el ejemplo de aclaración:

//Redis Variables 
var redis = require('socket.io/node_modules/redis'); 
var RedisStore = require('socket.io/lib/stores/redis'); 
var pub = redis.createClient(); 
var sub = redis.createClient(); 
var client = redis.createClient(); 
var redis_store = new RedisStore({ 
         redisPub: pub, 
         redisSub: sub, 
         redisClient: client 
         }); 

app.configure(function(){ 
    //...code goes here... 
    app.use(express.session({ 
        secret: 'secret', 
        key: 'key', 
        store: redis_store //Notice I'm using redis_store 
        })); 
    //...more code... 
}); 

io.configure(function(){ 
    io.set('store', redis_store); //Notice it's the same RedisStore() being used 
}); 

puedo utilizar la misma para cada RedisStore()? ¿Creo uno separado para cada uno? ¿Solo uso express o socket.io? Lo que realmente quiero es poder autenticar clientes (supongo que eso se hace a través de sesiones) y hacer que actualicen la base de datos redis cuando se conectan, manteniendo un registro de cuándo las personas accedieron a mi sitio. Lo que lleva a mi segundo problema.


segundo problema
así que no tengo idea de cómo acceder y editar la base de datos Redis desde este punto. No he podido probar esto a causa de mi primer problema, pero supongo que sería algo como esto:

io.sockets.on('connection', function(socket){ 
    var session = socket.handshake.session; 
    redis.put(session); 
}); 

Tampoco he visto ninguna documentación sobre cómo actualizar una base de datos Redis desde dentro del nodo. js así que altamente dudas que redis.put() es la terminología correcta jaja. He visitado redis's website pero no puedo encontrar comandos para node.js. Solo comandos para usar redis regulares desde la línea de comando. De todos modos, si alguien podría al menos apuntarme en la dirección correcta, sería genial. Gracias. :)

+0

Una nota: si termina usando una contraseña en su tienda redis, tendrá que pasar el módulo redis bajo la tecla 'redis' como parte de su constructor RedisStore. Para obtener más información, consulte: http://stackoverflow.com/questions/13438613/redis-auth-error-with-node-js-and-socket-io – Konklone

Respuesta

3

Express y Socket.IO tienen su propia integración con Redis para la gestión de sesiones, como habrás visto. Está diseñado como una integración de Blackbox, con la idea de que la implementación de la tienda de sesiones sea independiente del resto de su código. Dado que es independiente, eso significa que no puede ingresar y usar express o socket.io para acceder directamente a Redis. Necesitarás agregar un cliente redis regular como node_redis. El beneficio es que no tiene que preocuparse por hacer todas esas llamadas a redis, sino que interactuará con Express o las interfaces de tienda de sesión de socket.io.

Por lo tanto, en su caso n. ° 1, podría pasar una instancia nueva de RedisStore, no dos nuevas como lo ha hecho. O puede seguir su segundo enlace y tener socket.io escuchar a través de expreso. En ese caso, se integraría con la administración de sesiones express. Es por eso que no ve la llamada extra io.set ('store') en ese ejemplo.

Probablemente parezca redundante para usted, pero trate de pensar en RedisStore como un cliente especial diseñado solo para la gestión de sesiones. Incluso pensamos que RedisStore probablemente se basa en algo como node_redis, no deberías intentar acceder a él.Debe incluir otra biblioteca para acceder directamente a su base de datos redis, suponiendo que en primer lugar quisiera almacenar otros elementos que no sean de sesión en redis.

+0

Sí, estoy planeando escribir otras cosas en la base de datos. De acuerdo, miren [node_redis] (https://github.com/mranney/node_redis) Veo que ya estoy accediendo a eso con mi variable redis, pero para ser claro, dicen que debería 'npm install redis' ser en el mismo nivel que socket.io y luego usar esa instancia para mi propio acceso a la base de datos? Además, dado que estoy planeando hacer eso y todo lo que realmente deseo de las tiendas express o de socket.io es poder acceder a los datos de la sesión, ¿debería incluso usar un RedisStore() para eso? ¿O debería hacer como si el primer enlace muestra y usar MemoryStore? – Aust

+0

Sí, lo que probablemente quieras hacer es dejar de usar el cliente redis dentro del paquete socket.io e incluir el tuyo en la raíz del proyecto. MemoryStore no está mal, pero si desea tener múltiples servidores web o mantener la sesión sobre reinicios de nodo, me quedaría con RedisStore. Si desea mantener las sesiones redis, buscaría connect-redis en lugar de sacar la tienda redis del proyecto socket.io también. –

Cuestiones relacionadas