2014-06-15 5 views
5

Volevo solo sapere, all'inizio del mio processo NodeJS, se Redis è stato avviato o meno (quindi la sessione degli utenti verrà archiviata o meno).Controlla se redis è in esecuzione -> node js

Ecco quello che ho per il momento:

var session = require('express-session'); 
var RedisStore = require('connect-redis')(session); 
var redis = require("redis"); 
var client = redis.createClient(global.redis.host, global.redis.port); 

// Check if redis is running 
var redisIsReady = false; 
client.on('error', function(err) { 
    redisIsReady = false; 
    console.log('redis is not running'); 
    console.log(err); 
}); 
client.on('ready', function() { 
    redisIsReady = true; 
    console.log('redis is running'); 
}); 

// Here I use express-session, but I want to set a store only if redis is ready 
    sessOptions = { 
     [...] 
    } 
    // Store setting 
    if (redisIsReady) { 
     sessOptions.store = new RedisStore({ 
      host: global.redis.host, 
      port: global.redis.port 
     }); 
    } else { 
     console.log("redis is not running - sessions won't be written to disk"); 
    } 
// app.use(session(sessOptions)) 

Ecco quello che è uscita in entrambi i casi (quando Redis è in esecuzione o meno):

redis is not running - sessions won't be written to disk 
redis is not running 
Error: Redis connection to 6379:localhost failed - connect ENOENT 

Quindi devo 2 domande:

  1. Come può Devo controllare se redis è in esecuzione prima di impostare il mio SessionStore (è comunque necessario verificare in modo sincrono se è in esecuzione redis)?

  2. Perché mi dà un errore anche quando è in esecuzione redis?

GRAZIE!


Nota: sto usando di default host/port (localhost, 6379) e il RedisStore funziona come previsto.

Nota 2: Sto usando Windows ... ma non abbiate paura, dovrebbe avere lo stesso comportamento!

Aggiornamento: Domanda # 2 risposto VMX => Grazie!

Update 2: Domanda # 1 risposta da Nathan => Grazie!

+1

Hai davvero avviato il server (digita 'redis-server &')? –

+0

Sì, il mio RedisStore si comporta come previsto, Redis salva con successo le sessioni utente. Posso recuperare la mia sessione usando il terminale redis_client. Non riesco a connettermi a redis usando createClient() – Oliboy50

+0

node_redis comportamento predefinito è quello di accodare i comandi dal momento in cui si chiama 'redis.createClient' fino a quando non viene stabilita la connessione, quindi è ben possibile che sia possibile istanziare un RedisStore e continuare con il tuo business senza dover verificare se redis è pronto. Provaci. – Mahn

risposta

4

Come ho fatto in passato, è tra l'impostazione della connessione Redis via

var client = redis.createClient(global.redis.port, global.redis.host); 

ed effettivamente iniziare la mia applicazione, sia che si tratti espressa o un'applicazione personalizzata, ho solo fare una semplice query , come ad esempio:

client.get(this.testKey, function(err,res) { 
    if(err) 
    throw err; 

    if(res === expectedValue) 
    return startApp(); 
}); 

essenzialmente solo mettere il codice per iniziare la vostra applicazione all'interno della richiamata a una query Redis, e sarà quindi sapere se Redis è in esecuzione in base al risultato.

+1

In realtà, volevo avviare la mia app anche se redis non era in esecuzione =/ – Oliboy50

+0

Beh, allora invece di lanciare un errore come quello che hai fatto potresti impostare un valore booleano e poi verificare se è vero prima di provare a memorizzare qualcosa in Redis. Se client.get() non riesce ad ottenere un valore da redis, eseguirà comunque la funzione di callback! – Nathan

+0

Infatti. Il mio progetto sembra un po 'più brutto ora. Ma almeno funziona come previsto. Grazie. – Oliboy50

5

2 problemi, in primo luogo la chiamata per creare client Redis è in ordine sbagliato, il createClient() prende port prima, poi il host, c'è un altro options argomento opzionale.

var client = redis.createClient(global.redis.port, global.redis.host); 

In secondo luogo, non sarai ancora in grado di ottenere ciò che stai cercando;

  1. L'evento ready viene attivato in modo asincrono, che non sia stato sottoposto la risposta pronta per il tempo di controllare per la bandiera redisIsReady.
  2. La bandiera redisIsReady verrà impostata su true, ma probabilmente il codice di inizializzazione della sessione probabilmente è già stato eseguito.

Si dovrà attendere prima di ottenere un evento error o ready da redis prima di inizializzare l'oggetto della sessione.

Spero che questo aiuti.

+0

Sì, il mio male per l'ordine degli argomenti ... Quindi ora funziona. Ma sono obbligato ad aspettare la risposta redis prima di inizializzare le mie sessioni ... E se devo "app.use (session)" prima di "app.use (something-else)"? – Oliboy50

+0

Utilizzare ciò che Nathan ha suggerito, eseguire una query fittizia per verificare la connettività redis e inizializzare la sessione di conseguenza. È possibile inserire tutti i codici di configurazione e inizializzazione dell'app all'interno della richiamata dei risultati della query. – vmx

+0

In realtà, volevo avviare la mia app anche se redis non era in esecuzione =/ – Oliboy50