Saya memiliki server node.js yang dimulai saat boot dengan upstart
Ubuntu. Karena server node.js dimulai sebelum Redis aktif dan berjalan, redis.createClient()
membuat pengecualian:
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)
Tentu saja saya mencoba membungkusnya dengan pernyataan coba / tangkap. Awal server saya:
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
});
Namun, ini tidak ada bedanya, saya masih mendapat pengecualian. Apa masalahnya dan bagaimana cara memastikan server saya menunggu sebelum Redis ada?
Ini terjadi karena klien mengeluarkan peristiwa "kesalahan". Dalam node, event bernama "error" adalah spesial. Jika Anda tidak mendengarkannya, mereka akan diubah menjadi pengecualian. Jadi dapatkan pendengar untuk "kesalahan" pada klien Anda, dan Anda tidak akan mogok. Kami secara otomatis mencoba lagi pada koneksi yang ditolak, jadi ini akan bekerja dengan sendirinya setelah Anda mendeteksi kesalahan.
Saya akan memperbaiki cara koneksi ulang dan kesalahan ditangani, karena skenario yang sangat umum ini akhirnya membingungkan banyak orang.
Apakah semua ini sudah ditangani! Saya mencoba menangkap kesalahan dalam blok coba tangkap. Tapi, itu tidak berhasil.
const client = redis.createClient ({
host: process.env.redis_hostname,
port: process.env.redis_port
})
client.on ('error', (error) => {
logger.error (error.message);
})
client.on ('connect', () => {
logger.info ('Berhasil terhubung ke redis');
})
Jadi ini akan terus melakukan polling untuk terhubung ke redis server dan ketika menemukan koneksi maka secara otomatis akan terhubung. Terima kasih @mranney untuk solusi cepat
Komentar yang paling membantu
const client = redis.createClient ({
host: process.env.redis_hostname,
port: process.env.redis_port
})
client.on ('error', (error) => {
logger.error (error.message);
})
client.on ('connect', () => {
logger.info ('Berhasil terhubung ke redis');
})
Jadi ini akan terus melakukan polling untuk terhubung ke redis server dan ketika menemukan koneksi maka secara otomatis akan terhubung. Terima kasih @mranney untuk solusi cepat