【问题标题】:socket emits multiple times to same client socketiosocket 向同一个客户端 socketio 发出多次
【发布时间】:2022-01-24 03:48:10
【问题描述】:

我在单独的 NodeJS 服务器上使用 socket.io,并使用 socket.io-client 将 ReactJS 客户端连接到它。

连接正常,直到我向房间发送消息。

在我的服务器端我有:

const io = new Server(server, {
  cors: {
    origin: ["http://localhost:3000"],
    methods: ["GET", "POST"],
  },
});

io.on("connection", (socket) => {
  console.log(socket.id);

  socket.join("test");
 

  socket.on("newMessage", (data) => {
    console.log("new msg");
    io.to("test).emit("message", "testing");
  });

});

在 React.js 客户端上:

import React from "react";
import "./App.css";
import io from "socket.io-client";
const socket = io("http://localhost:4000");

function App() {
  const newEvent = () => {
    socket.emit("newMessage", "test");
  };
  socket.on("message", () => {
    console.log("message recieved");
  });
  return (
    <div className="App">
      <button onClick={newEvent}>Emit message</button>
      <p>test</p>
    </div>
  );
}

export default App;

当服务器发出 io.to("test).emit("message", ... ) 时,客户端的 socket.on("message") 方法会运行多次

我还没有找到解决这个重复问题的方法,有没有办法让消息只向客户端发出一次而不是多次?

【问题讨论】:

    标签: node.js reactjs sockets websocket socket.io


    【解决方案1】:

    我发现了问题。

    在客户端接收事件时,您应该在套接字更改时在 .on 侦听器上使用 useEffect。

    例如,

    useEffect(() => {
         socket.on("message", () => {
              console.log("new message")
         })
    },[socket])
    

    这样做将确保侦听器为每个连接的客户端运行一次。

    【讨论】:

    • 还要在你的useeffect中从清理中移除socket,否则它将多次重新发出一个socket事件;清理功能中的 socket.remove('message')
    • 我在清理函数中添加了另一个有 socket.disconnect() 的 useEffect(() => {...}, [])。
    • 但最好在清理功能中删除套接字,否则它会发出多次
    猜你喜欢
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2021-11-03
    • 2012-05-10
    相关资源
    最近更新 更多