Estoy usando NodeJS y Socket.io. Recibo una consulta del usuario (https://localhost:3000?id=12345) y, al usar esta consulta, quiero enviar contenido exclusivo a este usuario específico. Ahora mi problema es que todos los clientes obtienen datos de acuerdo con la última consulta del último cliente. He intentado hacer habitaciones y muchas otras soluciones que he pensado o encontrado en línea, pero sin suerte.
Estoy recibiendo la consulta de la página así,
app.get('/', async ({ query }, response) => { ... }Cliente
$(document).ready(function () { socket.emit('room', key); socket.on('a1', function (data) { $("#a1").empty().append(data); }); socket.on('a2', function (data) { $("#a2").empty().append(data); }); socket.on('a3', function (data) { $("#a3").empty().append(data); }); socket.on('a4', function (data) { $("#a4").empty().append(data); }); …Servidor
io.on('connection', function (socket) { console.log('Connection'); socket.removeAllListeners(); socket.on('create', function (data) { console.log(`Data: ${data}`); socket.join(data); io.in(data).emit('a1', a1); io.in(data).emit('a2', a2); io.in(data).emit('a3', a3); io.in(data).emit('a4', a4); }) }); …Realmente no puedo entender cómo separar la consulta de cada cliente del servidor y luego enviar contenido único a cada cliente sin que el contenido de un cliente interfiera con otro. Mi idea inicial fue hacer una sala por cliente y enviar su contenido único usando esa sala, pero por alguna razón, es como si el contenido terminara en cada cliente.
¡Muchos gracias!
Es solo girar el objeto utilizado para administrar mejor el contenido de esta manera:
El lado del cliente:
$(document).ready(function () { const userKey = 'unique-id-for-each-user' socket.emit('room', {key : key, userKey : userKey}); //if you emit something in this channel (same as userKey) on server will get here socket.on(userKey, function (data) { if(data.key === 'a1') $("#a1").empty().append(data.content); if(data.key === 'a2') $("#a2").empty().append(data.content); if(data.key === 'a3') $("#a3").empty().append(data.content); }); //if you emit something in this channel ('allClients') on server will get here socket.on('allClients', function(data) { if(data.key === 'a1') $("#a1").empty().append(data.content); if(data.key === 'a2') $("#a2").empty().append(data.content); if(data.key === 'a3') $("#a3").empty().append(data.content); }) });El lado del servidor:
io.on('connection', function (socket) { console.log('Connection'); socket.removeAllListeners(); socket.on('room', function (data) { console.log(`Data: ${data}`); if(data.key === 'a1') io.sockets.emit(data.userKey, {key : 'a1', content: a1}); if(data.key === 'a2') io.sockets.emit(data.userKey, {key : 'a2', content: a2}); if(data.key === 'a3') io.sockets.emit(data.userKey, {key : 'a3', content: a3}); if(data.key === 'a4') io.sockets.emit(data.userKey, {key : 'a4', content: a4}); }) });Como ves, solo cambio la variable que pasas como parámetro para darme lo que necesito, tanto del lado del servidor como del lado del cliente.