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