Tengo un servidor node.js que comienza en el arranque con upstart
Ubuntu. Debido a que el servidor node.js se inicia antes de que Redis esté en funcionamiento, redis.createClient()
arroja una excepción:
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)
Por supuesto, trato de envolverlo en una declaración try / catch. El inicio de mi servidor:
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
});
Sin embargo, esto no hace ninguna diferencia, todavía tengo una excepción. ¿Cuál puede ser el caso y cómo puedo asegurarme de que mi servidor espera antes de que Redis esté disponible?
Esto sucede porque el cliente está emitiendo un evento de "error". En el nodo, los eventos denominados "error" son especiales. Si no los escucha, se convierten en excepciones. Así que obtenga un oyente para "error" en su cliente y no se bloqueará. Reintentamos automáticamente cuando se rechaza la conexión, por lo que esto debería funcionar solo una vez que escuche los errores.
Sin embargo, voy a reelaborar la forma en que se manejan las reconexiones y los errores, porque este escenario muy común termina siendo confuso para mucha gente.
¿Se ha manejado algo de esto? Estoy tratando de detectar los errores en un bloque try catch. Pero no está funcionando.
const client = redis.createClient ({
host: process.env.redis_hostname,
puerto: process.env.redis_port
})
client.on ('error', (error) => {
logger.error (error.message);
})
client.on ('conectar', () => {
logger.info ('Conectado con éxito a redis');
})
Así que esto seguirá sondeando para conectarse al servidor de redis y cuando encuentre una conexión, se conectará automáticamente. Gracias @mranney por una solución rápida
Comentario más útil
const client = redis.createClient ({
host: process.env.redis_hostname,
puerto: process.env.redis_port
})
client.on ('error', (error) => {
logger.error (error.message);
})
client.on ('conectar', () => {
logger.info ('Conectado con éxito a redis');
})
Así que esto seguirá sondeando para conectarse al servidor de redis y cuando encuentre una conexión, se conectará automáticamente. Gracias @mranney por una solución rápida