【问题标题】:socket.io: Is is possible to intercept a join namespace request?socket.io:是否可以拦截加入命名空间请求?
【发布时间】:2016-06-09 03:25:32
【问题描述】:

我的 Node.js 知识相当基础。我正在使用 socket.io 在 iOS 应用程序中创建服务器和 socket.io-client-swift。

我希望服务器根据客户端应用程序上的用户选择创建一个动态命名空间。这个想法是所有具有特定选择的用户都加入服务器上的相同命名空间。这允许将消息广播给命名空间内的所有这些用户。

问题在于 socket.io 文档和代码似乎假定您将在 node.js 代码中硬编码命名空间名称,并且命名空间将在客户端 iOS 代码尝试加入之前定义。

这是我想要发生的事情:

  1. 客户端请求加入名为“abc”的命名空间。
  2. 服务器收到请求。
  3. 服务器上的某些东西检查了请求,发现当前没有“abc”的命名空间并动态分配一个。
  4. 服务器完成加入请求的处理,将套接字连接到新创建的命名空间。

这是我遇到问题的第 3 步。我尝试使用io.use(function(socket, next){...} 拦截传入的请求,但似乎是在服务器确定请求是否存在匹配的命名空间之后发生的。

有人知道如何拦截传入的命名空间请求吗?

【问题讨论】:

  • 为什么你认为服务器必须“动态分配”一个命名空间?那部分让我很困惑。客户端只是连接到 socket.io 命名空间路径。在此之前,服务器无需创建任何内容。
  • 是的。如果您没有在服务器中使用io.use{...} 声明命名空间,那么服务器将忽略该命名空间。
  • 请告诉我io.use()如何“声明一个命名空间”。我还是不明白你在说什么。我知道你可以监听特定的传入命名空间连接。这就是你想要做的——不管命名空间如何,都监听所有命名空间连接?
  • 对不起,我的错。 io.of(...) 创建一个命名空间。 io.use(...) 添加拦截器。我需要做的是在传入请求被定向到命名空间之前拦截它。然后,如果请求当前不存在,我可以为请求创建名称空间。在找到命名空间后调用使用io.use(...) 创建的拦截器。我需要先做。

标签: node.js socket.io


【解决方案1】:

我想我明白了。我在 server.js 中添加了一些代码,如下所示:

// Lets Swizzle in some wrapper code.
//var originalConnection = Client.prototype.connect;
Client.prototype.originalConnect = Client.prototype.connect;
Client.prototype.connect = function(name){
    var nsp = io.nsps[name];
    if (!nsp) {
        io.of(name);
    }
    this.originalConnect(name);
};

实际上,我混入了一个用于创建动态命名空间的包装函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多