【发布时间】:2021-08-04 22:39:56
【问题描述】:
我将 socket.io 与 redis 一起使用,我需要获取套接字对象,因为我需要访问在中间件期间添加的数据。
当我这样做时:
const { socketServer } = require('../../socket/socket');
const allSockets = await socketServer.myNamespace.adapter.sockets(new Set());
我只得到套接字 id,而不是套接字对象。如何获取套接字对象?
使用:
socket.io:4.0.1.
socket.io-redis: 6.1.0
更新
const socketServer = {
_initialized: false,
_IO: null,
_myNamespace: null,
get IO() {
if (!socketServer._initialized) throw new Error('socketServer.create not called!');
return socketServer._IO;
},
get myNamespace() {
if (!socketServer._initialized) throw new Error('socketServer.create not called!');
return socketServer._myNamespace;
},
create: (server) => {
const { initMyNamespace } = require('./setupHandler');
socketServer._IO = io(server, { cors: { origin: '*' } });
const redisPort = config.get('redisPort');
const redisHost = config.get('redisHost');
const redisConnection = redisAdapter({ host: redisHost, port: redisPort });
socketServer._IO.adapter(redisConnection);
// inits
socketServer._myNamespace = socketServer._IO.of('myNamespace');
// Middlewares
socketServer._myNamespace.use(auth);
socketServer._myNamespace.on('connection', function (socket) {
initMyNamespace(socket);
});
socketServer._initialized = true;
},
};
在 api 调用中的另一个文件中:
router.post('/', async (req, res) => {
const { socketServer } = require('../../socket/socket');
let selectedSockets = [];
const allSockets = await socketServer.myNamespace.adapter.sockets(new Set());
const userCoordinates = req.body.coordinates;
for (const currentSocketObj of allSockets) {
if (isNear(userCoordinates, currentSocketObj.user.coordinates)) {
const distanceToLocation = distanceCalc(userCoordinates, currentSocketObj.user.coordinates);
currentSocketObj.distanceToLocation = distanceToLocation;
selectedSockets.push(currentSocketObj);
}
}
for (const currentSocketObj of selectedSockets) {
currentSocketObj.emit('testing123', {distance: currentSocketObj.distanceToLocation} );
}
});
【问题讨论】:
-
您使用的是哪个版本的 socket.io(我问的是 v4 中的一些 API 更改)?
-
@jfriend00 socket.io: 4.0.1。 socket.io-redis: 6.1.0
-
当你说你想得到“套接字对象”时,你是什么意思。如果这是一个服务器,那么在任何给定时间都有 N 个连接的套接字。另外,你用的是redis适配器和socket.io集群吗?
-
@jfriend00 我正在尝试访问具有握手的套接字项。我正在使用 redis 适配器。我以后会用socket.io集群
-
请显示您尝试访问套接字的代码上下文,因为它可能已经在
socket的范围内。
标签: javascript node.js redis socket.io