لدي خادم node.js يبدأ عند التمهيد باستخدام Ubuntu upstart
. نظرًا لأن خادم 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 موجودًا؟
يحدث هذا لأن العميل يرسل حدث "خطأ". في العقدة ، تعتبر الأحداث المسماة "خطأ" خاصة. إذا لم تستمع إليهم ، فسيتم تحويلهم إلى استثناءات. لذا احصل على مستمع لـ "خطأ" في عميلك ، ولن تتعطل. نعيد المحاولة تلقائيًا عند رفض الاتصال ، لذلك يجب أن يعمل هذا تلقائيًا بمجرد الاستماع إلى الأخطاء.
سأقوم بإعادة صياغة الطريقة التي يتم بها التعامل مع إعادة الاتصال والأخطاء ، لأن هذا السيناريو الشائع جدًا ينتهي به الأمر إلى إرباك الكثير من الناس.
هل تم التعامل مع أي من هذا! أحاول التقاط الأخطاء في كتلة محاولة الالتقاط. لكنها لا تعمل.
عميل const = redis.createClient ({
المضيف: process.env.redis_hostname ،
المنفذ: process.env.redis_port
})
client.on ('خطأ'، (خطأ) => {
logger.error (error.message) ؛
})
client.on ('connect'، () => {
logger.info ("تم الاتصال بنجاح بـ redis") ؛
})
لذلك سيستمر هذا في الاقتراع للاتصال بخادم redis وعندما يعثر على اتصال ، سيتم الاتصال تلقائيًا. شكرا mranney لحل سريع
التعليق الأكثر فائدة
عميل const = redis.createClient ({
المضيف: process.env.redis_hostname ،
المنفذ: process.env.redis_port
})
client.on ('خطأ'، (خطأ) => {
logger.error (error.message) ؛
})
client.on ('connect'، () => {
logger.info ("تم الاتصال بنجاح بـ redis") ؛
})
لذلك سيستمر هذا في الاقتراع للاتصال بخادم redis وعندما يعثر على اتصال ، سيتم الاتصال تلقائيًا. شكرا mranney لحل سريع