2012-07-23 23 views
14

एक ठेठ Redis चैट उदाहरण कुछ इस तरह जाना होगा पर Redis दूर करने के लिए कैसे (बस एक उदाहरण के लिए https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js देखें):'संदेश' श्रोताओं

io.sockets.on('connection', function (client) { //websocket connection 

    redis1.subscribe("chat"); 

    redis1.on("message", function(channel, message) { 
     console.log(message); 
     client.send(message); 
    }); 

    client.on('message', function(msg) { 
    redis2.publish("chat",msg.message); 
    }); 

    client.on('disconnect', function() { 
     redis1.quit(); 
    }); 
}); 

हालांकि, यहां मुद्दा यह है कि जब कोई client ' डिस्कनेक्ट ', redis1.on('message',FUNC(){}) श्रोता अभी भी जुड़ा हुआ है। कंसोल message प्रिंट करना जारी रखेगा। यदि कोई redis1 की ईवेंट श्रोता का निरीक्षण करना चाहता था, तो उन्हें अभी भी अनाम कार्य सुनना होगा।

मुद्दा यह है कि redis1.off(...) फ़ंक्शन नहीं है। तो, रेडिस संदेश श्रोता को अनइंड/सदस्यता समाप्त/हटाएं/हटाएं कैसे?

नोट: कोई केवल redis1.end() नहीं कर सकता है, क्योंकि इससे अन्य वेबसाइकिल जुड़े उपयोगकर्ताओं के लिए रेडिस कनेक्शन तोड़ दिया जाएगा।

उत्तर

21

नोड रेईपीएल में चारों ओर खेलकर मुझे मिला एकमात्र समाधान redis.on() सब्सक्राइब करने के लिए फ़ंक्शन का उपयोग नहीं करना है। इसके बजाय, किसी को redis.addListener() और redis.removeListener() फ़ंक्शंस का उपयोग करना चाहिए। इसके अलावा, किसी को ईवेंट कॉलबैक के रूप में अनाम कार्यों का उपयोग नहीं करना चाहिए। एक कुछ इस तरह कर सकता है:

var callback = function(channel, message){ 

}; 

redis1.addListener('message', callback); 

client.on('disconnect', function(){ 
    redis1.removeListener('message', callback);  
}) 
+4

redis ग्राहक है एक [EventEmitter] (http://nodejs.org/api/events.html#events_class_events_eventemitter) है, जो एक 'on' विधि है जो सिर्फ है 'addListener' के लिए उपनाम, और 'removeListener', जो कि इसके विपरीत है। तो आप अभी भी 'removeListener' का उपयोग करते हुए' on' का उपयोग जारी रख सकते हैं। –

+13

मेरे जैसे किसी भी व्यक्ति के लिए जो इसे स्किम किया गया और बिंदु को याद किया: निकालने वाला लिस्टर वास्तव में फ़ंक्शन को हटा रहा है, न केवल उस बाध्यकारी को साफ़ कर रहा है .. आईई। 'हटाएं लिस्टनर (' संदेश ', कॉलबैक)' संदेश 'बाध्यकारी से' कॉलबैक 'फ़ंक्शन को हटा रहा है। मतलब यह है कि यदि आप एक अज्ञात फ़ंक्शन 'redis1.addListener (' message ', function (c, m) {..}' का उपयोग कर रहे हैं, तो आपके पास श्रोता को हटाने का कोई तरीका नहीं है और रेडिस मृत सॉकेट – TheRightChoyce

+0

पर प्रकाशित करना जारी रखेगा @ Thechoyce आपकी टिप्पणी मुझे जवाब से अधिक जानकारी देता है! – laike9m