Node.js 在服务器端创建文件室ID,并使用sockets.io将客户端连接到该文件室

Node.js 在服务器端创建文件室ID,并使用sockets.io将客户端连接到该文件室,node.js,sockets,Node.js,Sockets,我想在服务器端创建一个随机房间ID,并将其发送到connect上的客户端,如下所示: io.sockets.on('connection', function(socket){ var roomID = Math.random().toString(36).substring(2, 13); io.emit('message', roomID); socket.on('subscribe', function(room) { socket.join(

我想在服务器端创建一个随机房间ID,并将其发送到connect上的客户端,如下所示:

io.sockets.on('connection', function(socket){
    var roomID = Math.random().toString(36).substring(2, 13);  
    io.emit('message', roomID);
    socket.on('subscribe', function(room) { 
        socket.join(room); 
    })
});
然后,一旦客户机拥有服务器创建的房间ID,我想将客户机加入该房间

 var socket = io.connect();
 var lobby;
 socket.on('message', function (data) {
    lobby=data;
 });

 socket.emit('subscribe', lobby);
问题是我无法将
lobb
变量从
socket.on()
函数中拉出。如果我理解正确的话,这是因为它在匿名函数中,这使得它是异步的

这里有什么解决办法吗?或者我是不是一直坚持在客户端给房间起个名字

更新:根据第一个答案,我更新了代码。

服务器:

io.sockets.on('connection', function(socket){
var roomID = Math.random().toString(36).substring(2, 13);  
io.emit('message', roomID);
    socket.on('subscribe', function(room) { 
        console.log('joining room', room);
        socket.join(room); 
        console.log(io.nsps['/'].adapter.rooms);
 })
});
客户:

var socket = io.connect();
socket.on('message', function (lobby) {
  $('#msg').val(lobby);
  socket.emit('subscribe', lobby);
});
输出(一个浏览器会话):

输出(两个浏览器会话):


为什么要将两个插座都连接到我的第二个房间?

在知道要加入哪个大厅之前,不要加入房间

 var socket = io.connect();
 socket.on('message', function (lobby) {
   socket.emit('subscribe', lobby);
 });

对此也要谨慎。。。根据您在服务器端处理事情的方式,任何客户端都可以连接到他们想要的任何大厅。

当我这样做时,它会将任何新的浏览器会话加入到自己的随机聊天室以及之前创建的任何聊天室。@Dshiz它只会加入您让它加入的内容。那么,我一定是服务器端出了问题。。我将尝试一下,看看是否能找出我的服务器端代码没有按预期工作的原因。我已经用完整的代码和输出更新了我的帖子,以显示我的问题。。如您所见,第二个浏览器会话将两个套接字添加到第二个文件室。@Dshiz您正在向所有连接的客户端发送消息。如果您只想让他们加入一件事,请不要在服务器上使用
io.emit
,而是使用
socket.emit
joining room c8p8gioeca0
{ TO1D6tBPU1TebZIPAAAA: Room { sockets: { TO1D6tBPU1TebZIPAAAA: true }, length:
1 },
  bugs69q9znr: Room { sockets: { TO1D6tBPU1TebZIPAAAA: true }, length: 1 },
  HDWyB6JXsB1rf3PdAAAB: Room { sockets: { HDWyB6JXsB1rf3PdAAAB: true }, length:
1 },
  c8p8gioeca0: Room { sockets: { TO1D6tBPU1TebZIPAAAA: true }, length: 1 } }
joining room c8p8gioeca0
{ TO1D6tBPU1TebZIPAAAA: Room { sockets: { TO1D6tBPU1TebZIPAAAA: true }, length:
1 },
  bugs69q9znr: Room { sockets: { TO1D6tBPU1TebZIPAAAA: true }, length: 1 },
  HDWyB6JXsB1rf3PdAAAB: Room { sockets: { HDWyB6JXsB1rf3PdAAAB: true }, length:
1 },
  c8p8gioeca0:
   Room {
     sockets: { TO1D6tBPU1TebZIPAAAA: true, HDWyB6JXsB1rf3PdAAAB: true },
     length: 2 } }
 var socket = io.connect();
 socket.on('message', function (lobby) {
   socket.emit('subscribe', lobby);
 });