Reactjs 无法建立套接字连接,它在调用 componentDidMount 时打开并获得响应

Posted

技术标签:

【中文标题】Reactjs 无法建立套接字连接,它在调用 componentDidMount 时打开并获得响应【英文标题】:Reactjs is unable to establish socket connection, it opens and getting response while calling on componentDidMount 【发布时间】:2019-01-17 15:14:32 【问题描述】:

我无法在 React.js 中打开 Web 套接字连接。在 componentDidMount 中调用相同函数时建立连接。当我开始使用任何事件(如 onClick 或 onSubmit)调用时,我无法打开连接并从服务器获得响应。

代码如下。

var exampleSocket = new WebSocket('wss://api.somedomain.io/WSGateway');

class MyClass extends Component 
  componentDidMount() 
    this.authenticate();
  
  authenticate() 
    exampleSocket.onopen = function (event) 
      var payload = 
        "UserName": "username",
        "Password": "password"
      ;
      var msg = 
        "m": 0,
        "i": 0,
        "n": "AuthenticateUser",
        "o": JSON.stringify(payload)
      ;
      exampleSocket.send(JSON.stringify(msg));
    
    exampleSocket.onmessage = function apiAuthenticateUser(event) 
      try 
        let data = JSON.parse(event.data);
        let o_data = JSON.parse(data["o"]);
        console.log(o_data);
       catch (err) 
        console.log(err);
      
    
  
render() 
  const  classes, theme  = this.props;
  return (
    <React.Fragment>
      <button
        name="authentication"
        id="testid1"
        onClick=(e) => 
          this.authenticate(e);
        
      >
        Login
        </button>
    </React.Fragment>
  )


export default MyClass;

【问题讨论】:

@halfer - 感谢您的建议,问题仍未解决 【参考方案1】:

我担心你的authenticate 方法没有绑定到组件的范围。在构造函数中使用 bind 或在声明中简单地使用箭头函数:

class MyClass extends Component 
  componentDidMount() 
    this.authenticate();
  

  authenticate = () => 
    exampl...

在onClick中简单地使用这种格式:

     <button
       ...
       onClick=this.authenticate
     >

【讨论】:

等一下让我试试这个方法 1.在构造函数中添加 this.authenticate = this.authenticate.bind(this); 2. 改为authenticate = () => 但同样的响应 React-wise 应该实现 1 或 2(但不能同时实现)。在这种情况下,另一个与套接字相关的错误发生在此之上。 我先尝试了第 1 点,然后尝试了第 2 点,是的,这是与套接字相关的东西,但是在使用 componentDidMount() 调用它时,相同的函数得到了正确的响应——这就是我感到困惑的原因 能够解决 DOM 元素的问题 - 套接字首先在实际 DOM 中打开,然后使用虚拟 dom 我刚刚同步了两者

以上是关于Reactjs 无法建立套接字连接,它在调用 componentDidMount 时打开并获得响应的主要内容,如果未能解决你的问题,请参考以下文章

如何与firebase建立内部连接并与其连接reactjs前端[关闭]

从 reactjs 客户端连接到安全 Web 套接字 python 服务器

ReactJS + Socket.IO - 处理套接字连接的最佳方式

部署到 ubuntu 后套接字 io 未连接(nginx、nodejs、reactjs)

TCP阻塞模型下服务器和客户端的建立步骤

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接