【问题标题】:Room not found/ accessible in io object在 io 对象中找不到/可访问房间
【发布时间】:2021-05-24 16:32:44
【问题描述】:

目前正在尝试了解 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 文件中分离代码时,也许我在这里尝试采用一种不好的方法。

任何帮助都会很棒。

【问题讨论】:

  • 两个函数的gameId是否相同?
  • gameId 是从客户端发送的,我在“addPlayer”调用中使用创建的。是的,它是一样的。 allSockets 的输出是 Set {}
  • 你可能已经检查过了,但你只调用了一次 hostCreateNewGame 和 playerJoinGame 多次。
  • 是的。但是,据我了解,只要您在我的案例 gameId 中引用相同的 roomName,它就不应该是相关的?!
  • 我不明白为什么这不起作用。如果您很着急并且仍然想要模块化,我建议您分离出一个文件以添加所有事件处理程序并将您的 io 对象和相关函数保存在一个地方。

标签: javascript node.js sockets socket.io


【解决方案1】:

终于搞定了。

问题是它返回了一个实数

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

而发送到 addPlayers 函数的值是一个字符串...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多