开发者问题收集

ReferenceError:客户端 TypeScript React 应用程序中未定义 WebSocket

2022-01-03
5635

我正在开发一个 React 前端应用程序,并尝试与我的 Golang 后端服务器建立 WebSocket 连接。

到目前为止,我有一个简单的类,它应该使用本机 websocket 对象启动 websocket 连接。它失败并出现错误 ReferenceError: WebSocket is not defined

export class MyService implements RealtimeService {
  socket: WebSocket;
  constructor() {
    console.log('initializing websocket connection');
    this.socket = new WebSocket('ws://localhost:50000');


    this.socket.on("open", (event) => {
      console.log('connection established');
    });

    this.socket.on("error", (event) => {
      console.log('connection failed', event)
    });

    this.socket.on('message', (event) => {
      console.log('received message from server ', event.data);
    })

    this.socket.on('close', (event) => {
      console.log('connection closed ', event);
    })
  }

  serviceName(): string {
    //TODO: implement
    return "";
  }

  subscribe(channelName: string): any {
    //TODO: implement
    return new Channel();
  }
}

我已尝试使用 npm install wsimport WebSocket from 'ws'; 安装 ws 包,基于此处的解决方案 https://stackoverflow.com/a/52037864/3083825 ,但看起来 ws 包在浏览器上不再起作用。失败并显示错误 Error: ws 在浏览器中不起作用。浏览器客户端必须使用本机 WebSocket 对象

我的问题是,为什么本机 WebSocket 对象不起作用?当我创建一个简单的 javascript 文件时,本机 WebSocket 对象工作正常,但在此 React 应用程序中不起作用。我该如何让它工作?

2个回答

不要在构造函数中定义 Websocket ,而是尝试使用 componentDidMount ,如下所示:

   componentDidMount() {
         let ws = new WebSocket('ws://localhost:50000');
    }

DOM 必须完全加载,浏览器才能访问 Websocket 。我认为这就是您收到该错误的原因。

我再次建议您放弃基于类的组件,并使用钩子 useEffect 使用功能组件重写代码。

Hypothesis
2022-01-03

在 next js 中,你需要在 useEffect 中调用 WebSocket 函数,因为 WebSocket 是一个浏览器函数,只有在 next 中安装组件后才可用,因此你可以像下面这样实现

function MyService(){
    useEffect(()=>{
        let ws = new WebSocket('ws://localhost:50000');
    },[])
  return <>{/* Your JSX */}</>
}
Goutham J.M
2023-05-17