J'ai un serveur node.js commençant au démarrage avec upstart
d'Ubuntu. Étant donné que le serveur node.js démarre avant que Redis ne soit opérationnel, redis.createClient()
lève une exception:
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)
Bien sûr, j'essaye de l'envelopper dans une instruction try / catch. Le démarrage de mon serveur:
var redis = require("redis");
function initializeRedis(callback) {
(function createClient(){
var client;
try {
client = redis.createClient();
} catch (e) {
setTimeout(createClient, 1000);
}
callback(client);
})();
};
initializeRedis(function(client) {
// Do things with client
});
Cependant, cela ne fait aucune différence, j'ai quand même une exception. Quel peut être le cas et comment puis-je m'assurer que mon serveur attend avant que Redis soit là?
Cela se produit car le client émet un événement "erreur". Dans le nœud, les événements nommés "erreur" sont spéciaux. Si vous ne les écoutez pas, ils sont convertis en exceptions. Alors obtenez un écouteur pour "erreur" sur votre client, et vous ne planterez pas. Nous réessayons automatiquement lorsque la connexion est refusée, cela devrait donc fonctionner automatiquement une fois que vous avez écouté les erreurs.
Je vais cependant retravailler la façon dont les reconnexions et les erreurs sont gérées, car ce scénario très courant finit par être déroutant pour beaucoup de gens.
Est-ce que tout cela a été traité! J'essaye d'attraper les erreurs dans un bloc try catch. Mais ça ne marche pas.
client const = redis.createClient ({
hôte: process.env.redis_hostname,
port: process.env.redis_port
})
client.on ('erreur', (erreur) => {
logger.error (error.message);
})
client.on ('se connecter', () => {
logger.info ('Connexion réussie à redis');
})
Donc, cela continuera d'interroger pour se connecter au serveur Redis et quand il trouve une connexion, il se connectera automatiquement. Merci @mranney pour une solution rapide
Commentaire le plus utile
client const = redis.createClient ({
hôte: process.env.redis_hostname,
port: process.env.redis_port
})
client.on ('erreur', (erreur) => {
logger.error (error.message);
})
client.on ('se connecter', () => {
logger.info ('Connexion réussie à redis');
})
Donc, cela continuera d'interroger pour se connecter au serveur Redis et quand il trouve une connexion, il se connectera automatiquement. Merci @mranney pour une solution rapide