2011-11-09 3 views
3

J'ai un programme simple, qui doit s'assurer que je peux me connecter à un serveur Redis. J'utilise node-redis pour me connecter et j'ai besoin d'attendre que Redis soit démarré. J'utilise ce morceau de code:Catch exception dans node.js

function initializeRedis(callback) { 
    (function createClient(){ 
     var runner; 
     try { 
      client = redis.createClient(); 
     } catch (e) { 
      setTimeout(createClient, 1000); 
     } 
     callback(); 
    })(); 
}; 

initializeRedis(function() { 
// Work here 
}); 

En effet, sans try/catch, je suis une exception Node.js:

node.js:134 
     throw e; // process.nextTick error, or 'error' event on first tick 
     ^Error: Redis connection to 127.0.0.1:6379 failed - ECONNREFUSED, Connection refused 
    at Socket.<anonymous> (/var/www/php-jobs/node_modules/redis/index.js:88:28) 
    at Socket.emit (events.js:64:17) 
    at Array.<anonymous> (net.js:830:27) 
    at EventEmitter._tickCallback (node.js:126:26) 

Quand je commence à Redis-serveur (machine Ubuntu) et Commencer ce script, tout fonctionne bien. Si j'arrête redis-server et démarre le script, il n'attrape pas l'exception et lance toujours la même exception. Comment est-ce possible? J'ai un essai/catch!

Répondre

8

Après client = redis.createClient();, définissez un gestionnaire pour l'événement error:

client.on('error', function(err) { 
    // handle async errors here 
}); 

Jetez un oeil à la trace de la pile - votre code est pas, donc il n'y a pas d'endroit où un try/catch pourrait attraper le Erreur.

+0

Si l'erreur est asynchrone, comment pourrais-je attendre d'avoir une connexion valide? Le problème dans mon cycle de démarrage est que ce script de noeud est démarré avec upstart et redis avec init.d. Apparemment, le nœud démarre plus tôt et je dois attendre que redis soit prêt aussi. C'est ce que j'essaie avec le setTimeout() et le rappel ici. –

+0

@JurianSluiman: Vous ne l'attendez pas, vous l'écoutez. Et n'utilisez pas setTimeout pour ce genre de choses, cela rend les chatons ** DIE **! – thejh

+0

évidemment le setTimeout() ne fonctionnera pas avec ce gestionnaire client.on ('error'), mais le problème est que je dois ATTENDRE avant de pouvoir continuer car JE DÉPEND du client. Le callback() est déclenché maintenant car aucune exception n'est levée et APRES que j'ai probablement déclenché cette erreur. Les erreurs de traitement asynchrones sont nulles parce que si vous dépendez du résultat, vous ne pouvez vraiment rien faire à ce sujet? –