【问题标题】:socket.io the room in the rooms dictionary is 'undefined'?socket.io 房间字典中的房间是“未定义的”?
【发布时间】:2022-05-08 13:09:49
【问题描述】:

所以我从我的客户端发出一个事件,该事件发送一个包含我试图连接到其中的套接字/房间 ID 的字符串。接收到数据后,由服务器端的这段代码处理:

const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
const port = process.env.PORT || 3000;

app.use(express.static(__dirname + '/public'));

//runs when the user connects to the server
function onConnection(socket){
  console.log('a user connected');
  // socket.join('some room');
  console.log('Created Room: ' + socket.id);

  socket.emit("RoomID", socket.id);
  socket.on("location", (receivedString) => {
    // socket.emit("RoomID", socket.id);
    socket.to(socket.id).emit("redirectLocation", receivedString);
    console.log('\nReceived the following data from socket "' + socket.id + '": ' + receivedString);
    console.log('The amount of people in this room is ' + io.sockets.adapter.rooms.get(socket.id).size + '.');
  });

  //runs when the user is trying to join a specific room
  socket.on("joinRoom", (roomIdentifier) => {
    console.log('The room identifier is: ' + roomIdentifier);
    console.log('The room is already in the rooms array: ' + io.sockets.adapter.rooms[String(roomIdentifier)]);
    if (io.sockets.adapter.rooms[roomIdentifier]) {
    socket.join(roomIdentifier);
    } else {
      console.log(socket.id + 'tried to join ' + roomIdentifier + 'but the room does not exist.');
    };
  });
  socket.on('disconnect', onDisconnection);
}

//runs when the user disconnects from the server
function onDisconnection(socket){
  console.log('a user disconnected');
}

//runs when the socket manager registers a connection
io.on('connection', onConnection);

//Runs when a new room was created
io.of("/").adapter.on("create-room", (room) => {
  console.log(`room ${room} was created`);
});

io.of("/").adapter.on("join-room", (room, id) => {
  console.log(`socket ${id} has joined room ${room}`);
});

http.listen(port, () => console.log('listening on port ' + port));

我不知道为什么它会以未定义的形式出现——我想可能是因为房间字典不应该有字符串或其他东西作为键,但我真的不确定。

【问题讨论】:

  • 房间是否在代码中的任何位置创建?
  • @Mehdi 哦,是的,当有人连接到套接字服务器时,会自动为他们创建一个房间——我更新了答案以显示我的整个 node.js 文件。只要我理解正确,当用户建立与套接字服务器的连接时,就会创建一个新的“默认房间”,其 ID 与他们的 socket.id 相同——现在,如果他们想加入特定的套接字房间,他们发送一个 roomIdentifier 应该将他们放入正确的房间(使用 join 函数)
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 4.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?

标签: javascript node.js sockets socket.io serversocket


【解决方案1】:

分享的代码有两个问题:

检查房间是否已经存在

以下命令显示 io.sockets.adapter.rooms 是 JavaScript Map object

console.log(io.sockets.adapter.rooms)
// returns [object Map]

要检查地图是否包含房间名称,应使用Map.has(key),而不是Map[key]

io.sockets.adapter.rooms.has(roomIdentifier)

一旦房间存在检查按照上述方式进行调整,代码仍然无法让用户加入房间,如下所述。

加入房间

if 语句仅在房间已经存在时才允许用户加入房间,否则不执行任何操作。因此,房间永远不会被创建,因此任何用户都无法加入其中的任何一个。

if (io.sockets.adapter.rooms.has(roomIdentifier)) {
  socket.join(roomIdentifier);
} else {
  console.log(socket.id + 'tried to join ' + roomIdentifier + 'but the room does not exist.');
  // Socket.join is not executed, hence the room not created.
};

socket.join 应该在if 语句之外执行。 if 语句可能可以从代码中删除,除非需要根据它采取一些特定的操作。

if (io.sockets.adapter.rooms.has(roomIdentifier)) {
  // action when room already exists
} else {
  console.log(socket.id + 'tried to join ' + roomIdentifier + 'but the room does not exist.');
  // action when room is new
};

// join the room in any case
socket.join(roomIdentifier);

【讨论】:

  • 这真的很棒,但我的问题是,在运行初始 onConnection() 函数时,房间不是已经创建到新的套接字服务器了吗?然后从那里我必须运行 joinRoom() 将用户切换到不同的套接字?
  • 每个套接字都自动连接到由socket.id标识的自己的房间。您无需为此运行join。查看文档。 socket.io/docs/v3/rooms/index.html#Default-room 。您可能想澄清每个连接应该发生什么。
【解决方案2】:

尝试使用io.sockets.adapter.rooms.get(roomId) io.sockets.adapter.rooms 返回一个地图对象,所以使用io.sockets.adapter.rooms[roomId] 返回未定义

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 2019-05-13
    • 1970-01-01
    • 2017-05-10
    • 2019-06-25
    • 2019-03-02
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多