node使用websocket + redis发布订阅时的问题

在写一个聊天程序,通过websocket发送信息,服务端收到信息,将信息存到redis中,触发pub发布事件,sub订阅事件,从redis中拿信息。

// redis
const redis = require("redis");
const redisConf = require('../redis/conf').conf;

// 发布者
const pub = redis.createClient(redisConf);
// 订阅者
const sub = redis.createClient(redisConf); 

function initSocket(WebSocket){

    // 引用Server类:
    const WebSocketServer = WebSocket.Server;

    // 实例化:
    const wss = new WebSocketServer({
        port: 3001
    });

    /**
     * 监听socket连接
     */
    wss.on('connection',function(ws,req){

        // redis订阅事件
        sub.on('message', function(channel, message) {
            
        })
              
        ws.on('message', function incoming(message) {
           .. 先把message存redis中
           saveIntoRedis(message)
           
           // 发布通知
           pub.publish('sendMsg',JSON.stringify(message)) 
        }))

        /**
         * 断开连接
         */
        ws.on('close',function(){
       
        });
    });
}

module.exports = {
    initSocket
}

当我的pub和sub都定义在头部的时候,会出现一个bug,当我的socket断开重连后,每次订阅事件会重复触发2次,再重连socket,订阅事件会重复触发3次...依次类推。

当我把sub的创建放到socket连接成功回调中,如下

/**
     * 监听socket连接
     */
    wss.on('connection',function(ws,req){
        // 订阅者
        const sub = redis.createClient(redisConf); 
    })

就正常了,是什么原因呢。

阅读 1.8k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题