2012-10-05 2 views
6

Primo problema
Sto cercando di capire sessioni, negozi, autorizzazioni e redis. Se è importante, sto usando [email protected]. Capisco che ho due opzioni per mettere il mio RedisStore(). Quale uso? Li uso entrambi?In node.js, come posso eseguire il redis con socket.io ed express? Specificamente utilizzando RedisStore()

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

ho già node.js, express e socket.io esecuzione. Così ora sto cercando di implementare redis ma non so come implementare l'autorizzazione usando sessioni/negozi e non so come scrivere sul database redis. Non ho trovato alcuna documentazione su questo. Ho trovato un sito che parla di sessioni e negozi utilizzando socket.io and express ma senza redis, e un altro che parla di sessioni e negozi using all three, ma non utilizza io.set('store', ...).

Inoltre, non so se dovrei utilizzare due negozi diversi, uno per lo express e uno per lo socket.io o se dovrei usarne uno solo. Guarda l'esempio per chiarire:

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

posso utilizzare lo stesso per ogni RedisStore()? Creo quelli separati per ciascuno? Devo semplicemente usare express o socket.io? Quello che voglio veramente è riuscire ad autenticare i client (presumo che ciò avvenga tramite le sessioni) e fare in modo che aggiornino il database redis quando si connettono, mantenendo un registro quando le persone accedono al mio sito. Il che porta al mio secondo problema.


secondo problema
quindi non ho idea di come accedere e modificare il database Redis da questo punto. Non sono stato in grado di testare questo a causa del mio primo problema, ma suppongo che sarebbe stato qualcosa di simile:

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

anche io non ho visto alcuna documentazione su come aggiornare un database Redis dall'interno nodo. js so I altamente dubbio che redis.put() è la terminologia corretta haha. Ho visitato redis's website ma non riesco a trovare i comandi per node.js. Solo comandi per l'utilizzo di redis regolari dalla riga di comando. Ad ogni modo, se qualcuno potesse almeno indicarmi la giusta direzione sarebbe fantastico. Grazie. :)

+0

Una nota: se si finisce per utilizzare una password sul proprio negozio redis, è necessario passare il modulo redis stesso sotto la chiave 'redis' come parte del costruttore RedisStore. Per maggiori informazioni, consultare: http://stackoverflow.com/questions/13438613/redis-auth-error-with-node-js-and-socket-io – Konklone

risposta

3

Express e Socket.IO hanno la propria integrazione con Redis per la gestione delle sessioni, come hai visto. È progettato come un'integrazione blackbox, l'idea è che l'implementazione del session store è indipendente dal resto del codice. Poiché è indipendente, ciò significa che non puoi entrare e usare express o socket.io per accedere direttamente a Redis. Dovrai aggiungere un client redis regolare come node_redis. Il vantaggio è che non ti devi preoccupare di fare tutte quelle chiamate redis, invece interagirai con le interfacce Express o socket.io's store.

Quindi nel tuo caso # 1, potresti passare in una singola nuova istanza di RedisStore, non due nuovi come hai fatto tu. O potresti seguire il tuo secondo link e avere socket.io ascoltare attraverso express. In tal caso si integrerebbe con la gestione della sessione espressa. Ecco perché non vedi la chiamata extra io.set ('store') in quell'esempio.

Probabilmente ti sembrerà ridondante, ma prova a pensare a RedisStore come a un client speciale progettato solo per la gestione delle sessioni. Anche se RedisStore si basa probabilmente su qualcosa come node_redis, non dovresti provare ad accedervi.Devi includere un'altra libreria per accedere direttamente al tuo database redis, supponendo che tu voglia archiviare altri elementi non di sessione in redis in primo luogo.

+0

Sì, sto pensando di scrivere altre cose nel database. Ok, guardando [node_redis] (https://github.com/mranney/node_redis) posso vedere che sto già accedendo con la mia variabile redis, ma per essere chiari tu dici che dovrei 'npm installare redis' per essere allo stesso livello di socket.io e quindi utilizzare quell'istanza per il mio accesso al database? Inoltre, poiché sto pensando di farlo e tutto ciò che voglio veramente da Express o dai negozi di socket.io è di poter accedere ai dati di sessione, dovrei usare anche un RedisStore() per quello? O dovrei fare come il primo link mostra e utilizzare MemoryStore? – Aust

+0

Sì, quello che probabilmente vorresti fare è smettere di usare il client redis all'interno del pacchetto socket.io e includerne uno nella root del progetto. MemoryStore non è male, ma se vuoi avere più server web o mantenere la sessione dopo il riavvio del nodo, allora rimango con RedisStore. Se vuoi mantenere le sessioni di redis, guarderei i redis connect invece di estrarre il redis store dal progetto socket.io. –