【问题标题】:How to send Redis message to client side when a new message is published in that channel在该通道中发布新消息时如何将 Redis 消息发送到客户端
【发布时间】:2016-06-26 13:46:39
【问题描述】:

我正在尝试实现一个功能,其中当用户查看页面时,他应该自动订阅该用户独有的 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 侦听器,因为我想将消息发送到套接字。这可能是面临问题的原因。 Dono 该怎么做,因为我需要套接字实例将消息发送到客户端。请帮忙。

【问题讨论】:

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


    【解决方案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);
    });
    

    【讨论】:

    • 非常感谢达伦。你让我今天一整天都感觉很好!已修改答案以添加经过测试的解决方案。
    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 2020-09-09
    • 2013-04-24
    • 2012-01-21
    • 2012-01-18
    • 2020-07-10
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多