流星:检查有多少客户端订阅了某个发布功能

Meteor: Check how many clients are subscribed to a certain publish function

本文关键字:布功能 功能 检查 多少 客户端 流星      更新时间:2023-09-26

有没有办法检查某个发布函数的当前订阅客户端的数量?问题是我有不同的组,每个组都有自己独特的ghash。当用户选择离开组并输入新组时,此 ghash 会更改并订阅 SAME 发布功能,尽管当然使用不同的ghash

所以我正在寻找一种方法来检查一次(在服务器端)订阅了多少个客户端到每个组/ghash。我整天都在摆弄这样的东西,但说实话,效果并不好。我也在听套接字的"unsub"事件等等,但仍然......这都是地狱般的越野车。

如果有人对我的整个代码感兴趣,你可以在这里找到它!(我发现它太长了,无法将其粘贴到我的帖子中。

我真的希望有人能帮忙! :-)

干杯,P

编辑:或者换句话说:有没有办法计算当前连接到sockjs websocket的客户端数量,其中所有这些websocket都使用相同的参数调用?

====

==================================================================================

编辑2:新版本:链接

由于某种原因,这根本不起作用...不会进行插入,因为提供给订阅的 ghash 永远不会等于任何实际的套接字订阅(-->参见 lin 20:ghash 永远不会等于 ghash2)。我只是不明白这怎么可能?每次会话ghash更改时都会调用整个订阅函数。这个 var 怎么可能永远不等于提交给实际套接字(提交)的参数?(它总是一个ghash,但总是另一个组的ghash)。

我真的迷路了! :-(

我现在看到你正在做直接的旧节点风格的 socket.io 编程。 我在节点项目中做过类似的事情。 这也许是真正的问题。 在Meteor的文档上,他们甚至没有使用插座这个词。 也许其他人会和你一起提出这个新问题,但是这个关于跟踪订阅者的问题是由这个答案回答的。

我认为流星是一个新世界,如果你适应它的思维方式,它会为你处理这些事情。 例如,创建消息集合,其中包含聊天室字段。 每个客户端选择他们的聊天室,找到这些消息.find({chatroom:'box5'}),并显示它们。 一条新消息会自动发送到正在收听该聊天室的每个客户端。 让流星为你使用插座。

计算客户订阅某些内容的答案:

伪代码:创建一个对象来保存每个订阅签名的计数计数 = {}

注册时,创建一个唯一表示订阅的字符串,将其添加到计数对象中。counts['参数作为字符串'] += 1;

注销时counts['参数作为字符串'] -= 1;

知道何时没有人仍然订阅的逻辑是这样的:完成 = (0 == 计数['参数作为字符串'] )

显然,据我所知,到目前为止,这是不可能的。我做了一些研究并尝试了很多事情,但由于某种原因,有时会打开多个 websocket 以将相同的数据传输到同一个客户端。-->通过这种方法无法计算连接的客户端数量。仅仅在我的ghash发生变化时触发一个事件也不够好,因为关闭浏览器窗口不会触发它。

我认为有一个功能来计算"查看相同数据更改"的客户端数量(想不出更好的表达方式)会很棒。也许一些流星核心开发人员可以把他/她的 2 美分放在这里,所以我们知道这是否可能。

我希望有人能在某个时候想出一个解决方案..我不能!:(

我的用户状态包通过跟踪全局发布函数的订阅数量来跟踪连接到 Meteor 应用程序的客户端数量。你也许可以从中汲取一些灵感。它在每个出版物级别上不是精细的,但您当然可以对您感兴趣的出版物执行相同的操作。

https://github.com/mizzao/meteor-user-status

需要注意的要点是

  • 每个打开的会话都将调用订阅(用户可能打开了多个选项卡)
  • 每次用户登录我们的退出时,订阅都会更新
  • 您可以在发布函数中读取每个会话的 ID
  • 您可以收听 SockJS 套接字的 close 事件,以了解浏览器选项卡被关闭等。

我认为对于团体来说,这样做不会太难;我正在为另一个项目做同样的事情。