我有一个从Ubuntu的upstart
启动时启动的node.js服务器。 由于node.js服务器是在Redis启动并运行之前启动的,因此redis.createClient()
引发异常:
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)
当然,我尝试将其包装在try / catch语句中。 我的服务器的启动:
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
});
但是,这没有什么区别,我仍然有一个例外。 可能是什么情况,如何确保服务器在Redis出现之前等待?
之所以发生这种情况,是因为客户端发出了“错误”事件。 在节点中,名为“错误”的事件是特殊的。 如果您不听他们的话,它们会被转换成异常。 因此,在客户端上获取“错误”的侦听器,您就不会崩溃。 我们会在连接被拒绝时自动重试,因此一旦您侦听错误,此方法便会自动解决。
我将重新处理重新连接和错误的处理方式,因为这种非常常见的情况最终会使很多人感到困惑。
有没有任何处理! 我正在尝试在try catch块中捕获错误。 但是,它不起作用。
const client = redis.createClient({
主机:process.env.redis_hostname,
端口:process.env.redis_port
})
client.on('error',(error)=> {
logger.error(error.message);
})
client.on('connect',()=> {
logger.info('已成功连接到Redis');
})
因此,这将继续轮询以连接到Redis服务器,并且在找到连接时它将自动连接。 感谢@mranney快速解决方案
最有用的评论
const client = redis.createClient({
主机:process.env.redis_hostname,
端口:process.env.redis_port
})
client.on('error',(error)=> {
logger.error(error.message);
})
client.on('connect',()=> {
logger.info('已成功连接到Redis');
})
因此,这将继续轮询以连接到Redis服务器,并且在找到连接时它将自动连接。 感谢@mranney快速解决方案