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 io
→ io.emit('base', { datas });
2 curtidas