Node-redis: جرب إذا كان خادم Redis قيد التشغيل

تم إنشاؤها على ١٦ أكتوبر ٢٠١١  ·  3تعليقات  ·  مصدر: NodeRedis/node-redis

لدي خادم 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 موجودًا؟

question

التعليق الأكثر فائدة

عميل const = redis.createClient ({
المضيف: process.env.redis_hostname ،
المنفذ: process.env.redis_port
})
client.on ('خطأ'، (خطأ) => {
logger.error (error.message) ؛
})
client.on ('connect'، () => {
logger.info ("تم الاتصال بنجاح بـ redis") ؛
})

image
لذلك سيستمر هذا في الاقتراع للاتصال بخادم redis وعندما يعثر على اتصال ، سيتم الاتصال تلقائيًا. شكرا mranney لحل سريع

ال 3 كومينتر

يحدث هذا لأن العميل يرسل حدث "خطأ". في العقدة ، تعتبر الأحداث المسماة "خطأ" خاصة. إذا لم تستمع إليهم ، فسيتم تحويلهم إلى استثناءات. لذا احصل على مستمع لـ "خطأ" في عميلك ، ولن تتعطل. نعيد المحاولة تلقائيًا عند رفض الاتصال ، لذلك يجب أن يعمل هذا تلقائيًا بمجرد الاستماع إلى الأخطاء.

سأقوم بإعادة صياغة الطريقة التي يتم بها التعامل مع إعادة الاتصال والأخطاء ، لأن هذا السيناريو الشائع جدًا ينتهي به الأمر إلى إرباك الكثير من الناس.

هل تم التعامل مع أي من هذا! أحاول التقاط الأخطاء في كتلة محاولة الالتقاط. لكنها لا تعمل.

عميل const = redis.createClient ({
المضيف: process.env.redis_hostname ،
المنفذ: process.env.redis_port
})
client.on ('خطأ'، (خطأ) => {
logger.error (error.message) ؛
})
client.on ('connect'، () => {
logger.info ("تم الاتصال بنجاح بـ redis") ؛
})

image
لذلك سيستمر هذا في الاقتراع للاتصال بخادم redis وعندما يعثر على اتصال ، سيتم الاتصال تلقائيًا. شكرا mranney لحل سريع

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات