在写一个聊天程序,通过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);
})
就正常了,是什么原因呢。