[RESOLVIDO] Socket.io emitindo evento várias vezes

Fiz um chat usando socket.io.
O bug q estou enfrentando é o seguinte:
Os primeiros dois usuários que se conectam ao chat conseguem conversar normalmente, porém a partir do 3º usuário as mensagens enviadas pelo mesmo chegam repetidas para os outros usuários!
Por exemplo: O 3º usuário manda a mensagem “Oiee” para o 1º usuário:

User3: Oiee
--------------------
User3: Oiee <---- Mensagem repetida, isso não devia estar aqui

A mensagem se repete 2 vezes.
E o número de repetições aumenta dependendo da “numeração” do usuário: As mensagens do usuário 4 se repetem 3 vezes; As do usuário 5, 4 vezes; E assim sucessivamente.

Código que gerencia o recebimento de mensagens (Front-End):

  /* Handle received messages*/
  socket.on('receive message', (msg) => {
    console.log(msg.sender, 'to', msg.to) //<--- debug
    if (!openChats[msg.senderId]) {
      openChats[msg.senderId] = [];
    }
    openChats[msg.senderId].push(msg);
    if (socket.chattingWith === msg.senderId){
      createMessage('received', msg);
    }
  });

Através do debug com console.log, eu percebi que o listener desse evento “receive message” está se repetindo, conforme a lógica que expliquei lá em cima.

Código que envia mensagens (back-end):

  /*Handle send messages*/
  socket.on('send message', (msg) => {
    console.log(msg.sender, 'to', msg.to) //<--- debug
    io.to(msg.to).emit('receive message', msg)
  });

Usei o mesmo debug aqui e o console.log foi executado só uma vez, logo não é o evento “send message” que está sendo repetido.

Não sei se estou perdendo algo na documentação do emit de eventos, mas já pesquisei bastante e não achei nenhuma solução, alguém pode me ajudar?

Mostra a sua implementação inicial do socketio

No backend tá assim:

const server = http.createServer(app); //<--- express
const io = new Server(server);
io.on('connection', socket => {
  console.log('Conectado:', socket.handshake.auth.username);
  let user = {
    name: socket.handshake.auth.username,
    id: socket.id
  };

  // Add the user to the connected users list
  users.push(user);
  // Then emit the list
  io.emit('getuserlist', users);

  // Handle send messages
  socket.on('send message', (msg) => {
    io.to(msg.to).emit('receive message', msg)
  });

  socket.on('disconnect', () => {
    console.log('Desconectado:', socket.handshake.auth.username);
    let disconnectedUser = {
      name: socket.handshake.auth.username,
      id: socket.id

    };
    users.splice(users.findIndex(userObject => userObject.id === disconnectedUser.id), 1);
    io.emit('getuserlist', users)
  });
});

certo.

Faz um teste por favor, no front faz isso:

  socket.off("evento").on("evento", (data) => {
      //TODO: algumaCoisa
  });
1 curtida

Consegui resolver com esse código.
O negocio é q tinha uma lista de usuários online, e ao clicar em um usuário o código configurava o listener para receber a msg. Então, toda vez que clicava era adicionada a mesma função como um novo listener, e acabava tendo vários listeners repetidos.
Só tava faltando esse off() mesmo, vlwwwwww

1 curtida