Node-redis: Tente se o servidor Redis está em execução

Criado em 16 out. 2011  ·  3Comentários  ·  Fonte: NodeRedis/node-redis

Eu tenho um servidor node.js começando na inicialização com upstart do Ubuntu. Como o servidor node.js inicia antes do Redis estar instalado e funcionando, redis.createClient() lança uma exceção:

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)

É claro que tento envolvê-lo em uma instrução try / catch. O início do meu 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
});

No entanto, isso não faz nenhuma diferença, ainda tenho uma exceção. Qual pode ser o caso e como posso ter certeza de que meu servidor aguarda antes que o Redis chegue?

question

Comentários muito úteis

const client = redis.createClient ({
host: process.env.redis_hostname,
porta: process.env.redis_port
})
client.on ('erro', (erro) => {
logger.error (error.message);
})
client.on ('conectar', () => {
logger.info ('Conectado com sucesso ao redis');
})

image
Portanto, isso continuará pesquisando para se conectar ao servidor redis e quando encontrar uma conexão, ele se conectará automaticamente. Obrigado @mranney por uma solução rápida

Todos 3 comentários

Isso ocorre porque o cliente está emitindo um evento de "erro". No nó, os eventos denominados "erro" são especiais. Se você não os ouvir, eles serão convertidos em exceções. Portanto, obtenha um listener para "erro" em seu cliente e você não travará. Nós tentamos novamente automaticamente quando a conexão é recusada, então isso deve funcionar depois que você ouvir os erros.

Vou retrabalhar a forma como as reconexões e os erros são tratados, pois esse cenário muito comum acaba sendo confuso para muita gente.

Alguma coisa disso foi tratada! Estou tentando detectar os erros em um bloco try catch. Mas não está funcionando.

const client = redis.createClient ({
host: process.env.redis_hostname,
porta: process.env.redis_port
})
client.on ('erro', (erro) => {
logger.error (error.message);
})
client.on ('conectar', () => {
logger.info ('Conectado com sucesso ao redis');
})

image
Portanto, isso continuará pesquisando para se conectar ao servidor redis e quando encontrar uma conexão, ele se conectará automaticamente. Obrigado @mranney por uma solução rápida

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

dotSlashLu picture dotSlashLu  ·  5Comentários

ghost picture ghost  ·  3Comentários

b96705008 picture b96705008  ·  7Comentários

Mickael-van-der-Beek picture Mickael-van-der-Beek  ·  6Comentários

betimer picture betimer  ·  5Comentários