TypeError:无法读取 null 的属性(读取“发射”)

Posted

技术标签:

【中文标题】TypeError:无法读取 null 的属性(读取“发射”)【英文标题】:TypeError: Cannot read properties of null (reading 'emit') 【发布时间】:2022-01-16 13:52:10 【问题描述】:
import  io  from "socket.io-client";
import  useState, useEffect  from "react";

const Game = () => 

  const [socket, setSocket] = useState(null);
  const [name, setName] = useState("");
  const [room, setRoom] = useState("");

  useEffect(() => 
    setSocket(io(process.env.REACT_APP_BASE_URL));

    return () => 
      socket.emit("disconnect");
    ;
  , [socket]);

  const sendMessage = () => 
    socket.emit("room1",  name, room );
    socket.off();
  ;

  return (
    ...
  );
;

export default Game;

大家好。如标题所示,我收到此错误。如果我在 useEffect 依赖项中删除 socket,我不会再收到此错误,但这次我收到 React Hook useEffect has a missing dependency: 'socket'. Either include it or remove the dependency array react-hooks/exhaustive-deps 错误。

【问题讨论】:

socket 将暂时为空,因此快速解决方法是将socket.emit("disconnect") 更改为socket?.emit("disconnect") 如果我这样做,我会得到Error: "disconnect" is a reserved event name 嗯,这是一个单独的问题——但它没有抛出空指针异常,这就是你的帖子的内容。检查 socket.io-client 的文档以解决关于“断开连接”的第二个问题。 【参考方案1】:

你忘了定义套接字,现在它只是未定义。

useEffect(() => 
    const socket = io(process.env.REACT_APP_BASE_URL);
    setSocket(socket);

    return () => 
      socket.emit("disconnect");
    ;
  , [socket]);

而且你需要小心你的函数,因为你的发送消息函数将有未定义的套接字。

编辑:所以我注意到您正在使用状态,您可以稍作更改以使其也适用于状态

useEffect(() => 
    setSocket(await io(process.env.REACT_APP_BASE_URL));

    return () => 
      socket.emit("disconnect");
    ;
  , [socket]);

编辑 2:你应该等待你的套接字连接

【讨论】:

以上是关于TypeError:无法读取 null 的属性(读取“发射”)的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法读取 null 的属性(读取“classList”)

TypeError:无法读取 null 的属性(读取“1”)

TypeError:无法读取 null 的属性“userID”

TypeError:无法读取 null 的属性(读取“classList”)反应

TypeError:无法读取 null 的属性“uid”

× TypeError: 无法读取 null 的属性“名称”