Socket.io como manter uma conexão unica

Ultimamente estou usando, socket.io para desenvolver um projeto, e estou tendo um certo problema, basicamente, estou fazendo alguns teste, e num deles, eu gostaria de criar um programa, onde o usuário poderia, digita apenas um nome.

Na primeira vez o programa imprimi “Nome registrado”, e se o usuário tentar inserir outro ele diz “Não pode mais!”, até ai tudo bem. Mas o problema, está quando um novo usuário entra, pois quando ele tenta registra um nome, o programa diz “Não pode mais”, ou seja, como se ele já tivesse digitado um nome e já tentei, usar tudo que em teoria deveria resolver, mais não resolve.

Meu código do cliente:

<script>
    function clique(){
    var nome = document.getElementById('nome'); 
    var socket = io(); 
    socket.emit('n',nome)
    socket.on('n', function(nome){
          console.log(nome.saida);
    })
    }
</script>

No lado do servidor:

const express = require("express"); 
const { createServer } = require("http"); 
const { Server } = require("socket.io"); 

const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, { /* options */ });
var nomes = {foi:false}
app.get('/',(req,res)=>{
    res.sendFile(__dirname+"/index.html");
})
io.on("connection", (socket) => {
    socket.on('n',function(dado){
     if(nomes.foi == false){
        nomes.foi = true;
        socket.emit('n',{saida:"Nome registrado"})
     }else{
        socket.emit('n',{saida:"Não pode mais!"})
     }
    })
});

httpServer.listen(4000);

Não é um array que você necessita?, porque do jeito que você implementou o resultado é aquilo que você cita como problema!

Exemplo:

const express = require('express');
const { createServer } = require('http');
const { Server } = require('socket.io');
const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, {
  cors: {
    origin: 'http://localhost:4000',
  },
});
let datas = []; // nomes ...
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});
io.on('connection', function (socket) {
  socket.on('base', function (data) {
    if (data && data.length > 0 && datas.includes(data) === false) {
      datas.push(data);
    }
    io.emit('base', { datas });
  });
});
httpServer.listen(4000, () => {
  console.log('Server Init ...');
});

Html:

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <ul id="nomes"></ul>
  <input name="nome" id="nome" />
  <button type="button" onclick="clique()">Clique</button>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.5.1/socket.io.min.js"></script>
  <script>
    var socket = io();
    socket.on('base', function(response){
      loadNomes(response.datas);      
    });    
    socket.emit('base','');
    function loadNomes(datas) {
      $("#nomes").empty();
        if (datas.length > 0){
          $.each(datas, function(index, data) {
            $("#nomes").append("<li>" + data + "</li>");
          });
        }
    }
    function clique(){
      var nome = document.getElementById('nome').value;              
      socket.emit('base',nome)      
    }
</script>
</body>
</html>

Exemplo do resultado:

se tentar digitar novamente e nome já existir ele não inclue na lista! também alterei um código que estava socket para ioio.emit('base', { datas });

2 curtidas