'WebSocket connection failed: Insufficient resources , chat react app with useEffects

I'm having an issue with WebSocket. I'm using mqtt and react. The problem is that after sending 10+ messages on my chat, i get an error: mqtt.js:2202 WebSocket connection to 'ws://broker.emqx.io:8083/mqtt' failed: Insufficient resources. in the console. I can still sent messages though, but there are tons of same erros happening again and again. This is how my code looks like:

import React, { useEffect, useState } from "react";
import { v4 as uuidv4 } from "uuid";
import mqtt from "mqtt/dist/mqtt";
import { connect } from "react-redux";
import { useParams } from "react-router-dom";
import { withRouter } from "react-router";
// mqtt.connect("ws://broker.emqx.io:8083/mqtt")
const Chatroom = ({ usersLogged }) => {
  const { id } = useParams();

  const user = usersLogged.login;

  const [connectionStatus, setConnectionStatus] = useState(false);
  const [messages, setMessages] = useState([]);
  const [recivedMessage, setRecivedMessage] = useState(
    `${user} dołączyłeś do czatu`
  );
  const [NewMessage, setNewMessage] = useState("");
  const [Client, setClient] = useState(
    mqtt.connect("ws://broker.emqx.io:8083/mqtt")
  );
  useEffect(() => {
    if (!connectionStatus) {
      setClient(mqtt.connect("ws://broker.emqx.io:8083/mqtt"));
      setConnectionStatus(true);
    }
  }, []);
  useEffect(() => {
    if (id) {
      Client.subscribe(id);
    }
  }, [id]);

  useEffect(() => {
    Client.on("message", function (topic, messag) {
      const wiadomosc = messag.toString();
      setRecivedMessage(wiadomosc);
    });
  }, [Client]);
  useEffect(() => {
    setMessages((prevState) => [...prevState, recivedMessage]);
  }, [recivedMessage]);
  let view = messages.map((elem) => <div key={uuidv4()}> {elem} </div>);

  const ChangeHandler = (e) => {
    setNewMessage(e.target.value);
  };
  const sendMessage = (event) => {
    Client.publish(id.toString(), user + ": " + NewMessage);
    setNewMessage("");
    event.preventDefault();
  };

  return (
    <div className="Chatroom">
      <h1 className="title"> Chat in room: {id} </h1>
      <h3>{view}</h3>
      <h3>
        <form onSubmit={sendMessage}>
          <label className="ChatForm">
            Message:
            <input type="text" value={NewMessage} onChange={ChangeHandler} />
          </label>
          <input type="submit" value="Send" />
        </form>{" "}
      </h3>
    </div>
  );
};

const mapStateToProps = (state) => {
  return {
    usersLogged: state.users.loggedUsers,
  };
};

export default withRouter(connect(mapStateToProps, null)(Chatroom));

It happens no matter if im sending messages from two browser or from just one.



Solution 1:[1]

import React, { useEffect, useState } from "react";
import { v4 as uuidv4 } from "uuid";
import mqtt from "mqtt/dist/mqtt";
import { connect } from "react-redux";
import { useParams } from "react-router-dom";
import { withRouter } from "react-router";
// mqtt.connect("ws://broker.emqx.io:8083/mqtt")
const Chatroom = ({ usersLogged }) => {
  const { id } = useParams();

  const user = usersLogged.login;

  const [connectionStatus, setConnectionStatus] = useState(false);
  const [messages, setMessages] = useState([]);
  const [recivedMessage, setRecivedMessage] = useState(
    `${user} do??czy?e? do czatu`
  );
  const [NewMessage, setNewMessage] = useState("");
  const [Client, setClient] = useState(null);
  useEffect(() => {
    mqttConnect("ws://broker.emqx.io:8083/mqtt");
  }, []);

  const mqttConnect = (host) => {
    setClient(mqtt.connect(host));
  };

  useEffect(() => {
    if (!connectionStatus) {
      setClient(mqtt.connect("ws://broker.emqx.io:8083/mqtt"));
      setConnectionStatus(true);
    }
  }, []);
  useEffect(() => {
    if (Client) {
      Client.subscribe(id);
    }
  }, [Client]);

  useEffect(() => {
    if (Client) {
      Client.on("message", function (topic, messag) {
        const wiadomosc = messag.toString();
        setRecivedMessage(wiadomosc);
      });
    }
  }, [Client]);
  useEffect(() => {
    setMessages((prevState) => [...prevState, recivedMessage]);
  }, [recivedMessage]);
  let view = messages.map((elem) => <div key={uuidv4()}> {elem} </div>);

  const ChangeHandler = (e) => {
    setNewMessage(e.target.value);
  };
  const sendMessage = (event) => {
    Client.publish(id.toString(), user + ": " + NewMessage);
    setNewMessage("");
    event.preventDefault();
  };

  return (
    <div className="Chatroom">
      <h1 className="title"> Chat in room: {id} </h1>
      <h3>{view}</h3>
      <h3>
        <form onSubmit={sendMessage}>
          <label className="ChatForm">
            Message:
            <input type="text" value={NewMessage} onChange={ChangeHandler} />
          </label>
          <input type="submit" value="Send" />
        </form>{" "}
      </h3>
    </div>
  );
};

const mapStateToProps = (state) => {
  return {
    usersLogged: state.users.loggedUsers,
  };
};

export default withRouter(connect(mapStateToProps, null)(Chatroom));

this now works, thanks

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 user346206