Javascript 我的插座怎么能留在房间里,这样客户端就可以接收消息

Javascript 我的插座怎么能留在房间里,这样客户端就可以接收消息,javascript,node.js,reactjs,socket.io,Javascript,Node.js,Reactjs,Socket.io,我正在用Socket.io和Node构建一个小游戏。但是我遇到了一个问题,客户机没有收到发送到房间的任何消息。我在Node.js服务器中使用以下代码: 服务器 app.js game.js 客户端 game.js 永远不会调用client/game.js中的侦听器。当我调用LogSocket时,插座所在的唯一房间;这是我自己的房间。但是其他的电话一直在被呼叫;像“游戏”这样的称呼: 客户端 game.js 所以我的问题是:我做错了什么?为什么我的插座自己离开了房间?所以我的问题与反应有关 我使用

我正在用Socket.io和Node构建一个小游戏。但是我遇到了一个问题,客户机没有收到发送到房间的任何消息。我在Node.js服务器中使用以下代码:

服务器

app.js

game.js

客户端

game.js

永远不会调用client/game.js中的侦听器。当我调用LogSocket时,插座所在的唯一房间;这是我自己的房间。但是其他的电话一直在被呼叫;像“游戏”这样的称呼:

客户端

game.js


所以我的问题是:我做错了什么?为什么我的插座自己离开了房间?

所以我的问题与反应有关

我使用useffect()钩子中的套接字连接React客户端。 这个钩子使我的组件在connect调用中重新启动;这使得组件在每次重新加载时都会得到一个新的套接字。因此,套接字先前加入的房间仍然存在,但客户端有一个新的套接字


因此,我通过在顶部组件中启动套接字并使用React.Context将其传递给解决了这个问题。

因此我的问题与React有关

我使用useffect()钩子中的套接字连接React客户端。 这个钩子使我的组件在connect调用中重新启动;这使得组件在每次重新加载时都会得到一个新的套接字。因此,套接字先前加入的房间仍然存在,但客户端有一个新的套接字


因此,我通过在顶部组件中启动套接字并使用React.Context将其传递给解决了这个问题。

这不是一个答案,但我需要更多的堆栈点来简单地添加注释,这就是为什么我在这里发布的原因。我是否正确理解您使用useContext来监听前端顶级组件(例如App.js)中的事件。并通过EconText将套接字侦听器传递给您的子组件(game.js等)?

这不是答案,但我需要更多的堆栈点来添加注释,这就是为什么我在这里发布的原因。我是否正确理解您使用useContext来监听前端顶级组件(例如App.js)中的事件。并通过ThemeContext将套接字侦听器传递给您的子组件(game.js等)?

React.Context不仅仅适用于ThemeContext。您可以为任何目的创建任何上下文。这是我在App.js中创建的上下文<代码>常量SocketContext=createContext()之后,您需要将组件包装到提供程序
{…app.js}
中,我在提供程序中传递的值是套接字的缩减器,套接字本身.React.Context不仅仅用于ThemeSecontext。您可以为任何目的创建任何上下文。这是我在App.js中创建的上下文<代码>常量SocketContext=createContext()之后,您需要将组件包装到提供程序
{…app.js}
中,我在提供程序中传递的值是套接字和套接字本身的缩减器。
  io.on("connection", (socket) => {
    initGame(io, socket);
  });
exports.initGame = function (sio, socket) {
  socket.on("joinGameRoom", joinGameRoom);
  socket.on("logSocket", logSocket);
};

function logSocket() {
  let sock = this;
  console.log(sock.rooms);
}

async function joinGameRoom(data) {
  let sock = this;
  let game = data.game;

  await sock.join(String(game._id));
  await sock.in(String(game._id)).emit("playerJoined", game);
  await sock.emit("game", game);
}
socket.on("playerJoined", (data) => {
  setGame(() => data);
  console.log("player joined!");
});
socket.on("game", (data) => {
  setGame(() => data);
  console.log("game Call");
});