向指定房间发送消息的方式in Socket.io according to the docs看起来真的很简单。在下面的代码中是一个处理程序,是一个更大模块的一部分,但功能应该都很简单,特别是因为我正在显示公开每个变量代表什么的日志:
module.exports.handle = function(client, data, socket, sessions, callback) {
debug.log('Client, ' + data.name + ' sent message:' + data.message);
debug.log(JSON.stringify(data, null, 3));
var sessionId = data.code;
var name = data.name;
var room = JSON.stringify(socket.sockets.adapter.rooms[sessionId]);
debug.log('Socket.io Room: ' + room);
socket.to(sessionId).emit('receive message', {
name : data.name,
message : data.message,
sender : client.id
});
};
在以下日志中(基于之前的代码),我指定的房间显然是一个有效的 Socket.io 房间,所以我不明白为什么(在这种情况下).to('M57VUYD1')
无法将消息发送到房间。日志似乎验证了本例中的 M57VUYD1
是一个有效的房间。
[Debug][Send Message Event Handler]: Client, Jonathan sent message:hey
[Debug][Send Message Event Handler]: {
"message": "hey",
"name": "Jonathan",
"code": "M57VUYD1"
}
[Debug][Send Message Event Handler]: Socket.io Room: {"sockets":{"57VUYD1":true,"D4N178C":true},"length":2}
这个模块是否有问题导致它不能按预期工作?还是我使用了正确的语法?
我在全局范围内(非基于房间的)发送这些消息,并且客户端完美地接收了消息,所以我认为这不是我的客户端套接字事件监听器的问题。而且它似乎不是我加入房间的模块,因为日志显示两个客户端是房间的成员,因为他们应该在 Socket.io 的房间数据结构中。
我在 GitHub 上更详细地添加了这个问题:https://github.com/socketio/socket.io/issues/2518
最佳答案
答案是这样的:正如我在 Stack Overflow 上了解到的那样,更改 Socket.io 中的套接字 ID 是您可以做的,但我没有意识到的是这样做会破坏 Socket.io方式。其中一种方法是:房间系统将不再工作。
换句话说,不要将套接字 ID 更改为您自己选择的 ID,库不支持这样做。
关于javascript - 为什么我的消息没有发送到带有此处理程序的 Socket.io 房间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36405606/