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が存在する前にサーバーが待機していることを確認するにはどうすればよいですか?
これは、クライアントが「エラー」イベントを発行しているために発生しています。 ノードでは、「エラー」という名前のイベントは特別です。 あなたがそれらを聞かない場合、それらは例外に変換されます。 したがって、クライアントで「エラー」のリスナーを取得すれば、クラッシュすることはありません。 接続が拒否された場合は自動的に再試行するため、エラーをリッスンすると自動的に解決するはずです。
ただし、この非常に一般的なシナリオは多くの人を混乱させるため、再接続とエラーの処理方法を作り直します。
これのいずれかが処理されました! trycatchブロックでエラーをキャッチしようとしています。 しかし、それは機能していません。
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