参考错误:客户端typescript react应用程序中未定义WebSocket

jpfvwuh4  于 2023-05-17  发布在  TypeScript
关注(0)|答案(2)|浏览(141)

我正在开发一个React前端应用程序,我试图建立一个WebSocket连接到我的Golang后端服务器。
到目前为止,我有一个简单的类,它应该使用本机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 does not work in the browser. Browser clients must use the native WebSocket object
我的问题是,为什么原生WebSocket对象不工作?当我创建一个简单的javascript文件时,原生WebSocket对象工作正常,但在这个react应用程序中不工作。我怎么才能让它工作?

ccgok5k5

ccgok5k51#

不要在构造函数中定义Websocket,而是尝试使用componentDidMount

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

DOM必须完全加载,浏览器才能访问Websocket。我想这就是你犯这个错误的原因。
我再次建议你抛弃基于类的组件,使用钩子useEffect用函数组件重写代码。

owfi6suc

owfi6suc2#

在接下来的js中,你需要在useEffect中调用WebSocket函数,因为WebSocket是一个浏览器函数,只有在组件挂载到next中后才可用,所以你可以做的是像下面这样实现

function MyService(){
    useEffect(()=>{
        let ws = new WebSocket('ws://localhost:50000');
    },[])
  return <>{/* Your JSX */}</>
}

相关问题