SocketIO 4.1.1版本如何获取指定房间内的客户端列表
解决Socket.IO 4.1.1版本获取指定房间客户端列表的问题
问题原因
Socket.IO从4.0版本开始,socket.adapter.rooms的返回类型从普通JS对象改为了ES6 Map结构,所以不能用对象的方括号[]语法取值,自然会返回undefined。
正确实现方法
分两种场景按需选择:
- 基础同步获取(仅适用单节点部署场景,获取当前节点下的房间客户端ID集合)
直接调用Map的get()方法取值即可,返回的是Set结构存储的客户端socket ID列表:const roomClients = socket.adapter.rooms.get(idroom); console.log(roomClients); // 输出Set对象,包含该房间所有客户端的socket id // 如果要转成数组可以做如下处理 const clientIdList = Array.from(roomClients || []); - 跨节点/多实例场景的官方推荐方法
如果你的服务部署了多实例、使用了Redis适配器这类跨节点方案,需要用官方提供的in().allSockets()异步方法,会返回跨所有节点的该房间客户端ID集合:// 写法1:基于io实例调用 const clientIds = await io.in(idroom).allSockets(); // 写法2:基于socket实例调用 const clientIds = await socket.nsp.in(idroom).allSockets(); console.log(Array.from(clientIds)); // 转数组输出
注意事项
- 如果指定房间不存在、或者房间内没有任何在线客户端,
get()方法和allSockets()都会返回undefined或者空Set,建议取值后加空判断避免报错。 - 如果需要获取客户端socket的完整实例而非仅ID,你可以自行维护在线用户Map,通过返回的socket ID去对应的Map里取值即可。
内容的提问来源于stack exchange,提问作者20010dl
相关产品推荐
相关产品推荐

