在io对象中找不到/无法访问房间



目前正在尝试学习socket.io的工作原理,并创建一个基于房间的游戏,但在尝试将我的代码移动到一个单独的文件中后,很难将客户端转移到同一个房间。

如果我在io.on("connection")...中的app.js文件中使用game.js中的相同代码,我就可以访问房间并将玩家放在同一个房间中。

app.js

const express = require("express");
const cors = require("cors");
var http = require("http");
const game = require("./core/game/game");
const app = express();
const port = process.env.PORT || 4001;
const index = require("./routes/index");
const server = http.createServer(app);
const io = require("socket.io")(server, {
cors: {
origin: "*",
},
});
/
app.use(cors({ origin: "*" }));
app.use("/", index);
// Reduce the logging output of Socket.IO
/* io.set('log level',1); */
io.on("connection", (socket) => {
console.log("New client connected");
game.initGame(io, socket);

});
server.listen(port, () => {
console.log(`listening on *:${port}`);
});

game.js

var io;
var gameSocket;
/**
* This function is called by index.js to initialize a new game instance.
*
* @param sio The Socket.IO library
* @param socket The socket object for the connected client.
*/
exports.initGame = function (sio, socket) {
io = sio;
gameSocket = socket;
gameSocket.emit("connected", { message: "You are connected!" });
// Host Events
gameSocket.on("hostCreateNewGame", createRoom);
/*  gameSocket.on("hostRoomFull", hostPrepareGame);
gameSocket.on("hostCountdownFinished", hostStartGame);
gameSocket.on("hostNextRound", hostNextRound); */
// Player Events
gameSocket.on("playerJoinGame", addPlayer);
/* gameSocket.on("playerAnswer", playerAnswer);
gameSocket.on("playerRestart", playerRestart); */
};
async function createRoom(data) {
console.log("Create Session");
console.log(data);
console.log(data.username);
var gameId = (Math.random() * 100000) | 0;
console.log(data.username);
console.log(gameId);
//gameSocket.username = username;
gameSocket.join(gameId);
}
async function addPlayer(data) {
console.log("JOIN Session");
console.log(data.gameId);
//console.log(socket.username);
const clients = await io.in(data.gameId).allSockets();
console.log(clients);
if (!clients) {
console.error("[INTERNAL ERROR] Room creation failed!");
}
if (clients.size === 0) {
console.log("room does not exist");
return;
}
console.log(await io.in(data.gameId).allSockets());
gameSocket.username = data.username;
gameSocket.join(gameId);
console.log(await io.in(data.gameId).allSockets());
io.to(data.gameId).emit("joinSuccess", { message: "JUHU" });

如果我尝试使用此代码,客户端总是未定义的,这意味着我无法从我当前的io对象中访问房间

const clients = await gameSocket.in(data.gameId).allSockets(); //undefined

有人能告诉我需要更改什么才能访问正确的io对象并找到房间吗。当我试图从我的app.js文件中分离代码时,也许我试图遵循一种糟糕的方法。

任何帮助都会很棒。

终于成功了。

问题是,这返回了一个真实的数字

var gameId = (Math.random() * 100000) | 0;

而发送给addPlayers函数的值是一个String。。。

最新更新