Node-redis: Pruebe si el servidor Redis se está ejecutando

Creado en 16 oct. 2011  ·  3Comentarios  ·  Fuente: NodeRedis/node-redis

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?

question

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

image
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

Todos 3 comentarios

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

image
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

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

gpascale picture gpascale  ·  4Comentarios

b96705008 picture b96705008  ·  7Comentarios

shmendo picture shmendo  ·  6Comentarios

abhaygarg picture abhaygarg  ·  5Comentarios

strumwolf picture strumwolf  ·  4Comentarios