我正在开发一个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 ws
和import 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应用程序中不工作。我怎么才能让它工作?
2条答案
按热度按时间ccgok5k51#
不要在构造函数中定义
Websocket
,而是尝试使用componentDidMount
:DOM
必须完全加载,浏览器才能访问Websocket
。我想这就是你犯这个错误的原因。我再次建议你抛弃基于类的组件,使用钩子
useEffect
用函数组件重写代码。owfi6suc2#
在接下来的js中,你需要在useEffect中调用WebSocket函数,因为WebSocket是一个浏览器函数,只有在组件挂载到next中后才可用,所以你可以做的是像下面这样实现