Node.js Socket.io发送到套接字的数据错误(可能存在ID冲突)
目前,我们的web应用程序遇到一个问题,错误的数据被发送到套接字。根据我们看到的情况,由于我们的多服务器设置,可能会出现socketID冲突,但我们尚未确认 行为 加入一个聊天室的用户将开始随机接收来自另一个聊天室(他们尚未加入)的消息。当他们刷新时,他们又回到了应该得到的信息 我们的配置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
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上托管了我们的应用程序,并遵循了他们关于会话关联()的说明,但这似乎没有对该问题产生任何影响