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
相关产品推荐
相关产品推荐

