如何在该通道中发布新消息时将Redis消息发送到客户端

时间:2016-03-11 10:43:21

标签: node.js redis socket.io node-redis

我正在尝试实现一种功能,其中当用户正在查看页面时,他应该自动订阅该用户唯一的Redis频道。发布到Redis频道的所有消息都应该由客户端接收。

以下是客户端代码,

var socket = io.connect('localhost:5000');

socket.on('connect', function(){
  socket.emit("subscribe",$("#app_id").text());
});

socket.on('message', function(message) {
  $("#lst").append("<li>" + message + "</li>")
});

在nodejs服务器上,我有以下代码,

var client = redis.createClient();

io.sockets.on('connection', function (socket) {

  socket.on("subscribe",function(channel){
    client.subscribe(channel);
    socket.join(channel);
  });

  client.on("message", function(channel, message){
    socket.broadcast.to(channel).emit('message', message);
  });
});

当我在两个单独的浏览器中打开客户端页面时,它正确地订阅了两个频道,并且在客户端显示了发布到这些Redis频道的消息。但是,如果我刷新页面,我得到的消息数量是双倍的,如果我再次刷新,它会加起来。我猜每个刷新时听众都会得到补充。

我已经在socket.io连接侦听器中编写了Redis侦听器,因为我想将消息发送到套接字。这可能是我面临的问题的原因。不知道怎么做,因为我需要套接字实例向客户端发送消息。请帮忙。

1 个答案:

答案 0 :(得分:1)

正如您已经说过的:断开连接时删除侦听器。

请查看how-to-remove-redis-on-message-listenerssocket-io-handling-disconnect-event以便进一步阅读。

未经测试的样本

var client = redis.createClient();

io.sockets.on('connection', function (socket) {

  var broadcast = function(channel, message){
    socket.broadcast.to(channel).emit('message', message);
  }

  socket.on("subscribe",function(channel){
    client.subscribe(channel);
    socket.join(channel);
  });

  socket.on('disconnect', function() {
    client.unsubscribe(channel);
    client.removeListener(broadcast)
  })

  client.on("message", broadcast);
});