Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Qtde parametros não batem

Pq o emit é passado com 3 parametros, no caso, duas strings, e uma callback, e no servidor o on recebe só uma string e a callback com dois parametros? coisa básica de javascript mas não entendi essa lógica.

1 resposta
solução!

Oi, Bruno, tudo bem?

Esse funcionamento é devido à logica interna dos métodos do Socket.IO. Ao utilizarmos socket.emit, o primeiro parâmetro é sempre o nome do evento, e todos os parâmetros a partir do segundo serão os dados carregados pelo evento.

Já do outro lado da comunicação, ao utilizarmos o socket.on, o primeiro parâmetro é sempre o nome do evento a ser escutado, e o segundo parâmetro é sempre uma função callback. Essa função callback recebe como parâmetros exatamente todos os dados que enviamos com socket.emit.

Por exemplo, digamos que no front-end eu tenha o seguinte código:

socket.emit("dados_usuario", "Evaldo", 10, true);

Nesse código, além do nome do evento, passamos mais três parâmetros como dados do evento.

No lado do back-end, eu vou receber esses três parâmetros na função callback. Teremos o seguinte código:

io.on("connection", (socket) => {
  socket.on("hello", (dado1, dado2, dado3) => {
      console.log(dado1); // "Evaldo"
      console.log(dado2); // 10
      console.log(dado3); // true
  });
});

Da mesma forma, algo semelhante acontece quando utilizamos o recurso de Reconhecimento do Socket.IO. Se passarmos uma função como dado do socket.emit, podemos recebê-la do outro lado da comunicação, como um parâmetro da função callback.

Então, como na atividade, eu posso executar socket.emit no front-end passando três parâmetros: o nome do evento "nome_usuario", um dado "Evaldo", e mais um dado, que é uma função callback. Usamos o código a seguir:

socket.emit("nome_usuario", "Evaldo", (dadosUsuario) => {
  console.log(dadosUsuario);
});

E, do lado do back-end, o primeiro parâmetro de socket.on será o nome do evento, e o segundo será uma função callback que recebe os dois parâmetros restantes enviados pelo socket.emit: a string "Evaldo" e a função callback do front-end. Utilizamos o seguinte código:

io.on("connection", (socket) => {
  socket.on("nome_usuario", (nome, devolverDados) => {
    const dadosUsuario = obterDadosUsuario(nome);

    devolverDados(dadosUsuario);
  });
});

Entretando, é importante ressaltar que só é possível enviar uma função de um lado da comunicação para o outro apenas quando ela é o último parâmetro do socket.emit. Isso também é um critério estabelecido pelo próprio Socket.IO. Ao fazer isso, ele entende que você está querendo utilizar o recurso de Reconhecimento.

Espero ter ajudado! Abraços e bons estudos :)