当前位置: 首页 > 面试题库 >

Meteor文档中的messages-count示例如何工作?

薛烨霖
2023-03-14
问题内容

无法完全从文档中理解此示例…我尝试以多种方式运行该示例,以便观察其工作原理,等等。

您如何订阅?我们可以包括完成这项工作所需的客户端代码吗?

是否有一个名为的收藏messages-count?是Room消息集合吗?我们可以在示例中包含集合定义吗?

任何提示都很棒!

注意 :这是最初发布此问题(2012年5月)时显示的代码。现在更简单了。

// server: publish the current size of a collection
Meteor.publish("messages-count", function (roomId) {
  var self = this;
  var uuid = Meteor.uuid();
  var count = 0;

  handle = Room.find({room_id: roomId}).observe({
    added: function (doc, idx) {
      count++;
      self.set("messages-count", uuid, "count", count);
      self.flush();
    },
    removed: function (doc, idx) {
      count--;
      self.set("messages-count", uuid, "count", count);
      self.flush();
    }
    // don't care about moved or changed
  });

  // remove data and turn off observe when client unsubs
  self.onStop(function () {
    handle.stop();
    self.unset("messages-count", uuid, "count");
    self.flush();
  });
});

问题答案:

感谢您提示我写一个更清晰的解释。这是带有我的评论的完整示例。我已经清理了一些错误和不一致之处。下一个文档版本将使用此功能。

Meteor.publish非常灵活。它不仅限于将现有的MongoDB集合发布到客户端:我们可以发布任何我们想要的东西。具体来说,Meteor.publish定义客户可以订阅的一
组文档
。每个文档都属于某个集合名称(一个字符串),具有一个唯一的_id字段,然后具有一组JSON属性。当集合中的文档发生更改时,服务器会将更改向下发送给每个订阅的客户端,以使客户端保持最新状态。

我们将在此处定义一个名为的文档集,该文档集"counts-by-room"包含一个名为的集合中的单个文档"counts"。该文档将具有两个字段:一个roomId具有房间ID的字段,以及count:该房间中消息的总数。没有名为的实际MongoDB集合counts。这只是Meteor服务器将向下发送给客户_端的_ 集合的名称,并存储在名为的 客户端 集合中counts

为此,我们的publish函数采用一个roomId来自客户端的参数,并观察对该房间中所有Messages(在其他位置定义)的查询。我们可以在observeChanges这里使用更高效的观察查询形式,因为我们不需要完整的文档,而只是知道添加或删除了一个新文档。每当添加新消息并添加roomId我们感兴趣的消息时,我们的回调都会增加内部计数,然后将具有更新后总数的新文档发布到客户端。当删除一条消息时,它将减少计数并向客户端发送更新。

首次调用时observeChangesadded对于每个已存在的消息,将立即运行一些回调。然后,无论何时添加或删除邮件,将来的更改都会触发。

我们的发布功能还注册了一个onStop处理程序,以在客户端退订(手动或断开连接)时进行清理。该处理程序从客户端删除属性,并取消运行observeChanges

每次新客户端订阅时"counts-by-room",都会运行publish函数,因此每个客户端都将observeChanges代表其运行。

// server: publish the current size of a collection
Meteor.publish("counts-by-room", function (roomId) {
  var self = this;
  var count = 0;
  var initializing = true;

  var handle = Messages.find({room_id: roomId}).observeChanges({
    added: function (doc, idx) {
      count++;
      if (!initializing)
        self.changed("counts", roomId, {count: count});  // "counts" is the published collection name
    },
    removed: function (doc, idx) {
      count--;
      self.changed("counts", roomId, {count: count});  // same published collection, "counts"
    }
    // don't care about moved or changed
  });

  initializing = false;

  // publish the initial count. `observeChanges` guaranteed not to return
  // until the initial set of `added` callbacks have run, so the `count`
  // variable is up to date.
  self.added("counts", roomId, {count: count});

  // and signal that the initial document set is now available on the client
  self.ready();

  // turn off observe when client unsubscribes
  self.onStop(function () {
    handle.stop();
  });
});

现在,在客户端上,我们可以将其视为典型的Meteor订阅。首先,我们需要一个Mongo.Collection可以保存我们计算的计数文档的文件。由于服务器正在发布到名为的集合中"counts",我们将其"counts"作为参数传递给Mongo.Collection构造函数。

// client: declare collection to hold count object
Counts = new Mongo.Collection("counts");

然后我们可以订阅。(实际上,您可以在声明集合之前进行订阅:Meteor会将传入的更新排队,直到有放置它们的位置为止。) 订阅 的名称为"counts-by-room",它带有一个参数:当前房间的ID。我将其包装在内部,Deps.autorun以便进行Session.get('roomId')更改时,客户端将自动取消订阅旧房间的计数,然后重新订阅新房间的计数。

// client: autosubscribe to the count for the current room
Tracker.autorun(function () {
  Meteor.subscribe("counts-by-room", Session.get("roomId"));
});

最后,我们已经获得了文档,Counts并且可以像客户端上的任何其他Mongo集合一样使用它。每当服务器发送新计数时,任何引用此数据的模板都将自动重绘。

// client: use the new collection
console.log("Current room has " + Counts.findOne().count + " messages.");


 类似资料:
  • Meteor 是一个用于构建现代应用的超简单的开发环境。之前用最好的工具,都需要花费数周时间的事情,现在用Meteor,只需数小时。

  • 在我的REST API补丁操作中,我使用的是v3 我试图为我的补丁操作添加更多的示例作为swagger模式。 请求主体: 目前我有以下类的请求模型。 在PatchOperation.java中 @补丁 有没有办法,我可以为getOP、getPath和getValue方法添加多个示例?谢谢你。

  • 组件功能介绍和使用场景 准备 了解组件,需要额外的知识 知识点1 知识点2 安装 通过 Composer 安装 composer require swoft/xxx 注解 @XxxAnnotation 注解功能描述 arg 注解功能描述 arg2 注解功能描述 用法 以不同的使用场景,概括用法点,所有介绍切入点,都为使用场景。 实体 重要函数介绍格式 // 全局函数格式 xxxx(int $a,

  • 问题内容: 在哪里可以找到PythonMagick的文档和示例? 我在Google上进行了搜索,但没有找到太多信息。 问题答案: 编辑:没什么可看的。请参阅下面的更好的答案。 我也无法在任何地方找到它们,但这就是我继续使用它的方式。 例 用这样的输出 例如,要找出可用的映像方法,我查看了cpp源。进行Image对象绑定:在_Image.cpp中实现的Image 或更佳的做法是,查看关于获取 此页面

  • 我正试图生成一个预先签名的URL,其中包含文档中可用的确切代码: https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/examples-s3-presign.html 但我有一个错误: 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。 知道文档代码为什么不起作用吗?这似乎与AWS签名V4有关。我不知道

  • 问题内容: 1> 套装2排 2> 套装2排 3> 一组1行 为什么查询方式1>和2>会得到相同的结果?count(*)和count(somefiled)之间没有什么区别? 另外,查询2>和3>导致的结果不同,为什么 groupby 如此神奇?它是如何工作的? 更新:我正在使用MySQL5.1。:) 问题答案: 选择会给您一个结果集。如果按字段分组选择,则结果集的行将按该字段分组,并且结果集的每一行