javascript - 为什么我的消息没有发送到带有此处理程序的 Socket.io 房间?

标签 javascript socket.io

向指定房间发送消息的方式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/

相关文章:

javascript - 错误 : ClerkJS: Invalid frontendAPI option. 转到实例主页 https ://dashboard. clerk.dev 并获取您的 Frontend API 值

mongodb - 动态 node.js 内容

javascript - Jquery 或 php 从字符串中获取所有 html 并重建

javascript - 从 json 数组获取值

javascript - 如何使用 ng-grid 在单元格模板上应用字段

javascript - 数组和 ArrayBuffer 有什么区别?

javascript - 是否可以让来自 NGINX(端口 443)的 SSL 页面也在端口 3000 上使用 socket.io(通过 Node.js)

java - 如何从JSP建立与SocketClient的连接?

laravel - 我需要 Node.js 服务器和 Laravel Echo 服务器吗?

javascript - 在 javascript dom 操作后强制在 Internet Explorer 中刷新 DOM