Meteor发布/订阅最佳实践

时间:2015-12-03 09:51:52

标签: meteor

尝试了解有关Meteor的一些最佳做法。

我想显示每个用户的产品列表。我可以想出两种方式来显示每个用户的产品。

  • 方法1:仅发布此用户的产品,并在帮助程序中使用find({})方法显示所有这些产品
  • 方法2:为所有用户发布所有产品,并在帮助程序中使用find({' userid':this.userId})过滤掉当前用户的产品。

我首选方法1,因为它意味着在服务器和客户端之间发送更少的数据,但我看到人们通常也使用方法2.

方法1是最佳做法吗?

下面的源代码仅供参考。

方法1:

$("#subSectionalChartCanvas").empty(); 

方法2:

//Templates
Template.products.onCreated(function() {
      var self = this;
      self.autorun(function() {
        self.subscribe('products');
      });
    });


Template.products.helpers({
  getProducts: function () {
    return Products.find({}, { sort: { lastname: -1 }});
  }
});
//Publication
Meteor.publish('products', function () {
   return Products.find({'userid' : this.userId});
});

2 个答案:

答案 0 :(得分:2)

一般来说,答案是

方法1

在大多数情况下,您只想将必要的文档发送给客户,原因有两个:

  1. 安全性 - 您可能不希望任何用户打开控制台并查看其他用户的产品。
  2. 带宽/性能 - 您需要在服务器上传输和跟踪的文档越少,性能就越好。有一点需要注意,你最终会为该发布商提供0 observer reuse,但这可能会超过以前的数据。
  3. 方法2

    强烈建议始终在模板助手中进行过滤。如果您的帮助程序意味着“仅显示当前用户的产品”,那么您绝对应该在调用find时添加该选择器。其原因与代码维护有关。

    假设从现在起6个月后,您出于某些无关的原因最终发布了其他产品文档。如果您没有上述选择器,您的模板可能会做错事并为其他用户显示产品。

答案 1 :(得分:1)

有一些因素会影响使用哪种方法。

例如,如果产品列表被视为私人信息,则您不应使用方法2,因为每个用户的产品列表都将发送给每个客户。另一方面,拥有一个巨型出版物(方法2)可以简化您的代码。例如,您可以在启动时订阅一次(例如),而不必担心按路径或模板模板管理订阅,就像使用方法1一样。

正如您已经确定的那样,另一个考虑因素是已发布的产品系列的大小。通常,尝试限制发送到客户端的数据量,同时保持代码的可维护性。

希望有所帮助。