You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Socket.IO中io.in().emit()无法按预期工作问题排查

问题分析与修复

你的代码核心问题是加入房间时传递了数组而非房间名字符串,导致Socket.IO无法正确识别房间,最终io.in().emit()无法推送到目标房间内的用户。

错误点定位

原代码中:

let emptyRoomName = roomPool[emptyRoomData.emptyRoomIndex];
socket.join(emptyRoomName);

roomPool的每个元素是玩家数组(比如["playerA"]),这里emptyRoomName拿到的是整个数组,而Socket.IO要求房间名必须是字符串类型,所以socket.join()实际没有正确加入目标房间。

修正后的代码

io.on("connection", (socket) => {
  socket.on("initiateMatch", async (name) => {
    console.log(roomPool);
    let emptyRoomData = searchForEmptyRooms(roomPool);
    if (emptyRoomData.foundEmptyRoom) {
      // 获取目标房间的名字(数组第一个元素)
      const targetRoom = roomPool[emptyRoomData.emptyRoomIndex];
      const roomName = targetRoom[0];
      // 用字符串房间名加入
      socket.join(roomName);
      // 添加当前玩家到房间数组
      targetRoom.push(name);
      const opponentName = targetRoom.filter(player => player !== name)[0];
      console.log(name, opponentName);
      console.log(`${roomName} is the Room Name`);
      console.log(searchRoom(roomPool, targetRoom));
      // 向房间内所有用户推送消息
      io.in(roomName).emit("showBoard", name, opponentName);
    } else {
      // 创建新房间并加入
      socket.join(name);
      io.to(name).emit("insufficientPlayers");
      roomPool.push([name]);
    }
  });
});

额外检查点

  • 确保searchForEmptyRooms函数返回的emptyRoomIndex指向的是roomPool中玩家数为1的数组(符合你找未满2人房间的逻辑),避免误加入已满房间。
  • 可以在socket.join()后通过console.log(socket.rooms)打印当前socket所在的房间,验证是否成功加入目标房间。

内容的提问来源于stack exchange,提问作者IntriguedDeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:05:07