0

我整理了一个聊天应用程序,人们可以在其中加入/离开房间。我遇到了一些非常奇怪的事情,我真的无法理解它。

这是我的 server.js(后端)的摘录:

client.on("send", function(msg) {
  console.log("Sending to ==> " + client.room);
  if ('undefined' !== typeof client.room) {
    socket.sockets.in(client.room).emit("chat", people[client.id], msg);
  }
});

我本质上是在“强迫”人们加入一个房间(如果他们不在一个房间里,client.room 返回未定义。)

我在前端放置了两个按钮,一个用于加入房间,一个用于离开房间。加入按钮通过以下方式处理:

client.on("joinRoom", function(name) {
  client.join(name); //where name is the name of the room coming from the frontend
 }

离开房间功能如下所示:

client.on("leaveRoom", function(name) {
  client.leave(name);
}

现在,问题是这样的:在 client.leave(name); 之后 位,用户仍然可以发送消息,并且 console.log("Sending to ==> " + client.room); 当客户离开房间时,仍然会输出“发送到 ==> room1”)。我用“socket.sockets.clients(client.room)”确认了这一点——这里不再列出客户端。

有谁知道为什么我仍然从客户那里向他不属于的房间发出消息?

更新

在得到 DRC 的答复后,我更新了我的发送功能:

client.on("send", function(msg) {
  for (key in socket.sockets.manager.roomClients[client.id]) {
    if (key ==="/" + client.room) {
      socket.sockets.in(client.room).emit("chat", people[client.id], msg);  
    }
  }
});

这是最优雅的解决方案吗?

4

1 回答 1

1

您正在分配 client.room ,而不是在客户离开房间时将其删除,socket.io 不会检查授权,您必须这样做。

因此,每当客户端离开房间或检查用户是否在房间中检查内容时io.sockets.manager.roomClients[socket.id],请删除 client.room,请参阅文档

操作问题模块后更新。

您已经有了房间名称,所以 roomClients[socket.id] 的密钥,您可以检查:

if (socket.sockets.manager.roomClients[client.id]['/'+client.room] !== undefined ){
    //the user is part of this room
}

但是是的,这就是逻辑。

于 2013-07-15T10:57:53.227 回答