Node.js Socket.io发送到套接字的数据错误(可能存在ID冲突)

Node.js Socket.io发送到套接字的数据错误(可能存在ID冲突),node.js,socket.io,Node.js,Socket.io,目前,我们的web应用程序遇到一个问题,错误的数据被发送到套接字。根据我们看到的情况,由于我们的多服务器设置,可能会出现socketID冲突,但我们尚未确认 行为 加入一个聊天室的用户将开始随机接收来自另一个聊天室(他们尚未加入)的消息。当他们刷新时,他们又回到了应该得到的信息 我们的配置 var express = require('express')(); var api = require('http').createServer(express); /* * Configure so

目前,我们的web应用程序遇到一个问题,错误的数据被发送到套接字。根据我们看到的情况,由于我们的多服务器设置,可能会出现socketID冲突,但我们尚未确认

行为

加入一个聊天室的用户将开始随机接收来自另一个聊天室(他们尚未加入)的消息。当他们刷新时,他们又回到了应该得到的信息

我们的配置

var express = require('express')();
var api = require('http').createServer(express);

/*
 * Configure socket.io.
 */
var socketio = require('socket.io')(api, {
  serveClient: true,
  transports: ['websocket']
});
var redis = require('redis').createClient;
var adapter = require('socket.io-redis');
var pub = redis(appModules.config.redis.clients.socketio.port, appModules.config.redis.clients.socketio.host, {
  return_buffers: true,
  auth_pass: appModules.config.redis.password
});
var sub = redis(appModules.config.redis.clients.socketio.port, appModules.config.redis.clients.socketio.host, {
  return_buffers: true,
  auth_pass: appModules.config.redis.password
});
socketio.adapter(adapter({
  host: appModules.config.redis.clients.socketio.host,
  port: appModules.config.redis.clients.socketio.port,
  pubClient: pub,
  subClient: sub
}));
socketio.on('connection', function(socket) {
  socket.emit('connection-event', 'socket connection successful for socket: ' + socket.id);
  socket.on('disconnect', function() {
    require('../../main_socket/v1/disconnect')(this);
  });
  socket.on('reconnect', function() {
    require('../../main_socket/v1/reconnect')(this);
  });
  socket.on('client-event', function(data) {
    data = JSON.parse(data);
    appModules.shared.session.decryptToken(data.token)
      .then(function(jwt) {
        appModules.services.redis.clients.user_sessions.hgetallAsync(jwt.decodedToken.email)
          .then(function(session) {
            data.session = session;
            require('../../main_socket/' + data.apiVersion + '/' + data.context + '/' + data.action)(data, socket);
          })
          .catch(function(err) {
            logger.error(err);
          });
      })
      .catch(function(err) {
        logger.error(err);
      });
  });
});
假设

var express = require('express')();
var api = require('http').createServer(express);

/*
 * Configure socket.io.
 */
var socketio = require('socket.io')(api, {
  serveClient: true,
  transports: ['websocket']
});
var redis = require('redis').createClient;
var adapter = require('socket.io-redis');
var pub = redis(appModules.config.redis.clients.socketio.port, appModules.config.redis.clients.socketio.host, {
  return_buffers: true,
  auth_pass: appModules.config.redis.password
});
var sub = redis(appModules.config.redis.clients.socketio.port, appModules.config.redis.clients.socketio.host, {
  return_buffers: true,
  auth_pass: appModules.config.redis.password
});
socketio.adapter(adapter({
  host: appModules.config.redis.clients.socketio.host,
  port: appModules.config.redis.clients.socketio.port,
  pubClient: pub,
  subClient: sub
}));
socketio.on('connection', function(socket) {
  socket.emit('connection-event', 'socket connection successful for socket: ' + socket.id);
  socket.on('disconnect', function() {
    require('../../main_socket/v1/disconnect')(this);
  });
  socket.on('reconnect', function() {
    require('../../main_socket/v1/reconnect')(this);
  });
  socket.on('client-event', function(data) {
    data = JSON.parse(data);
    appModules.shared.session.decryptToken(data.token)
      .then(function(jwt) {
        appModules.services.redis.clients.user_sessions.hgetallAsync(jwt.decodedToken.email)
          .then(function(session) {
            data.session = session;
            require('../../main_socket/' + data.apiVersion + '/' + data.context + '/' + data.action)(data, socket);
          })
          .catch(function(err) {
            logger.error(err);
          });
      })
      .catch(function(err) {
        logger.error(err);
      });
  });
});
因为刷新似乎可以解决特定用户的问题,所以我们假设这是一个socketID冲突,因为他们在刷新时会得到一个新的冲突

附加注释

我们在Heroku上托管了我们的应用程序,并遵循了他们关于会话关联()的说明,但这似乎没有对该问题产生任何影响