Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算meteor出版物的当前订阅数_Meteor - Fatal编程技术网

如何计算meteor出版物的当前订阅数

如何计算meteor出版物的当前订阅数,meteor,Meteor,我在meteor服务器上有一份出版物,我想知道目前有多少客户端订阅了该出版物。原因是,我想向“发布所有者”显示订阅计数 下面是我如何尝试实现这一点的简化代码(当然,我不会使用console.log来增加/减少共享文档) 一般来说,这是可行的,但也存在一些问题: 如果我重新启动服务器,则订阅计数不同步(停止/终止/重新启动服务器时不会触发任何onStop事件) 可能还有其他一些边缘情况会导致订阅计数不同步 我可能可以通过在启动时将计数设置为0来解决其中的一些问题,但也许有更好的方法来查询服务器

我在meteor服务器上有一份出版物,我想知道目前有多少客户端订阅了该出版物。原因是,我想向“发布所有者”显示订阅计数

下面是我如何尝试实现这一点的简化代码(当然,我不会使用
console.log
来增加/减少共享文档)

一般来说,这是可行的,但也存在一些问题:

  • 如果我重新启动服务器,则订阅计数不同步(停止/终止/重新启动服务器时不会触发任何onStop事件)
  • 可能还有其他一些边缘情况会导致订阅计数不同步

我可能可以通过在启动时将计数设置为0来解决其中的一些问题,但也许有更好的方法来查询服务器当前的出版物订阅量?

我在文档中没有看到比您的想法更好的方法

下面显示了另一种可能的方法,它迭代这些订阅对象:

你可以把下面的代码放在你的服务器meteor代码中试试

 Meteor.setInterval(function(){
        var output = {};

        var connections = Meteor.server.stream_server.open_sockets;
        _.each(connections,function(connection){
          // named subscriptions
          var subs = connection._meteorSession._namedSubs;
          for(var sub in subs){
            var mySubName = subs[sub]._name;

            if(subs[sub]._params.length>0){
              mySubName += subs[sub]._params[0];  // assume one id parameter for now
            }

            if(!output[mySubName]){
              output[mySubName] = 1;
            }else{
              output[mySubName] += 1;
            }
          }
          // there are also these 'universal subscriptions'
          //not sure what these are, i count none in my tests
          var usubs = connection._meteorSession._universalSubs;


        });

        console.log(output);

      },2000);
这将每2秒向控制台输出每个“唯一”发布的订阅数。“唯一”发布类似于“Session1234”,其中“Sessions”是集合的名称,“1234”是订阅者传入的id。你可以按照你想要的方式构造它,我只是把每个“唯一”的出版物名称做成一个字符串

这是一个流星垫。但是meteor pad在每个应用程序会话中运行一个单独的服务器,所以如果打开更多选项卡,您将不会看到多个订阅者。但你至少可以了解它的工作原理:


我想如果你只想追踪那本书,你的想法很好。如果您有大量的收藏,并且希望对连接的客户机和事物进行分析,那么上述方法可能很有用。因为它不是官方MeteorAPI的一部分,所以很可能会因meteor版本的更改而中断。该示例使用setInterval只是为了更容易地演示输出,如果使用它,应该只在需要时运行它。

这是一个有趣的想法,效果很好。正如您所说,由于它只有一个订阅,我现在将坚持使用我的解决方案(到目前为止,除了在启动时将计数器设置为0之外,没有发现任何其他边缘情况)。我想在扩展到多个服务器成为一个问题之前一切都会好起来…嗨@looshi我现在用你的提示向所有活动订阅者发布数据-阅读更多信息:谢谢,Tom
 Meteor.setInterval(function(){
        var output = {};

        var connections = Meteor.server.stream_server.open_sockets;
        _.each(connections,function(connection){
          // named subscriptions
          var subs = connection._meteorSession._namedSubs;
          for(var sub in subs){
            var mySubName = subs[sub]._name;

            if(subs[sub]._params.length>0){
              mySubName += subs[sub]._params[0];  // assume one id parameter for now
            }

            if(!output[mySubName]){
              output[mySubName] = 1;
            }else{
              output[mySubName] += 1;
            }
          }
          // there are also these 'universal subscriptions'
          //not sure what these are, i count none in my tests
          var usubs = connection._meteorSession._universalSubs;


        });

        console.log(output);

      },2000);