2012-07-23 9 views
14

Một Redis điển hình trò chuyện ví dụ sẽ đi một cái gì đó như thế này (xem https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js cho chỉ là một ví dụ như vậy):Làm thế nào để loại bỏ Redis trên người nghe 'thông báo'

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(); 
    }); 
}); 

Tuy nhiên, vấn đề ở đây là khi một client ' ngắt kết nối ', trình nghe redis1.on('message',FUNC(){}) vẫn được đính kèm. Bảng điều khiển sẽ tiếp tục in ra số message. Nếu một người kiểm tra người nghe sự kiện là redis1, họ vẫn sẽ tìm thấy chức năng nghe nặc danh.

Vấn đề là không có hàm redis1.off(...). Vì vậy, làm thế nào để unbind/bỏ đăng ký/xóa/loại bỏ các trình nghe tin nhắn redis?

Lưu ý: Người ta không thể chỉ làm redis1.end(), vì điều đó sẽ phá vỡ kết nối redis đối với người dùng kết nối websocket khác.

Trả lời

21

Giải pháp duy nhất mà tôi đã tìm thấy bằng cách phát xung quanh trong nút REPL là không sử dụng chức năng redis.on() để đăng ký. Thay vào đó, bạn nên sử dụng các hàm redis.addListener()redis.removeListener(). Ngoài ra, người ta không được sử dụng các chức năng ẩn danh như gọi lại sự kiện. Người ta có thể làm điều gì đó như thế này:

var callback = function(channel, message){ 

}; 

redis1.addListener('message', callback); 

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

Client redis là một [EventEmitter] (http://nodejs.org/api/events.html#events_class_events_eventemitter), trong đó có một 'phương pháp on' mà chỉ là một bí danh cho 'addListener' và' removeListener', điều đó ngược lại. Vì vậy, bạn có thể tiếp tục sử dụng 'on', trong khi vẫn đang sử dụng' removeListener'. –

+13

Đối với bất cứ ai như tôi mà chỉ cần lướt qua điều này và bỏ lỡ điểm: removeListener thực sự là loại bỏ FUNCTION, không chỉ xóa thanh toán ràng buộc đó .. I.E. 'removeListener ('message', callback)' đang loại bỏ hàm 'callback' khỏi liên kết 'message'. Có nghĩa là nếu bạn đang sử dụng một hàm ẩn danh 'redis1.addListener ('message', hàm (c, m) {..}', thì bạn không có cách nào để loại bỏ trình lắng nghe và redis sẽ tiếp tục xuất bản tới các socket chết – TheRightChoyce

+0

@ Thechoyce Cảm nhận của bạn cho tôi nhiều thông tin hơn câu trả lời! – laike9m