我应该为每个集合使用一个或多个发布吗?

时间:2015-06-06 08:01:48

标签: javascript meteor meteor-publications

我正在开发用户组系统。每个小组都有几个功能,我希望与群组集合的交互尽可能安全和简单,因为它仍处于早期阶段。

现在,我在我的网站上有一个组部分,我使用了几个嵌套页面。该部分的目的是允许用户进入一个组,如果该组是私有的,请求成员资格,浏览一个组对象等。

例如,在我的小组部分中,我可以在收益中加载“查看所有群组”页面,“创建新群组”页面或“仅查看我的群组”(我是其中的成员)或“查看群组”以获取群组详细信息。

我的第一种方法是为每个子页面创建一个controller.js文件,该文件调用一个为子页面需求量身定制的订阅。例如,我为“查看所有群组”子页面提供了“all_group”发布/订阅,为“仅查看我的群组”子页面提供了“my_groups”。

但这变得非常混乱。另外,我在两个文件夹中都声明了我的“组”集合,所以我不确定要跟踪客户端可用数据的来源。

现在我解释了情况,这是我的问题:

  • 当我在客户端上执行console.table(Groups.find().fetch());时,我会看到不应该存在的字段(即我当前的出版物或任何其他出版物未返回的字段)。那是因为我在客户端宣布了“群组”集合吗?如何解决这个问题?
  • 我是否应该删除所有这些出版物并仅创建一个允许客户看到的所有内容?然后我会从组部分页面控制器订阅它并使用一组数据。
  • 我是否应该使用允许/拒绝规则阻止客户端中的任何插入/更新/删除,并仅使用这些方法?
  • 安全/建议将我的方法放在both文件夹中,这样我就不会失去延迟补偿功能吗?

修改 好吧,我吓坏了,因为我在客户端收集了所有的收集数据,但在发布中只是一个糟糕的查询(我使用了field:1field:0投影。 还有两个问题:

  1. 如果我使用方法,我认为我不必否认本机驱动程序中的所有内容,我只需要比允许的方法更具限制性,对吧?
  2. 如果我将我的方法放在两个文件夹中,它将在客户端和服务器上执行,因此在“客户端离线”上下文中,即使客户端弄乱了我的方法,服务器也应该回滚更改客户端结果与他的不同(假设使用allow-deny规则无法完成更改)?即使使用这些方法,我也会进行延迟补偿吗?

1 个答案:

答案 0 :(得分:1)

为了更好地控制和可视化您的订阅,您可以使用msavin:mongol

创建一个包罗万象的出版物在性能方面不是一个好主意(向所有客户发送所有数据对每个参与者都是一种痛苦。)

如果你使用方法并删除了autopublish,那么一切都被拒绝了...除了用户自己的个人资料上的更新。您可能也想手动拒绝。

使用方法和收集规则,您应该共享验证代码。这样,客户端和服务器以相同的方式验证(并且应该总是得出相同的结果),所以除非您的客户端搞砸了控制台,否则应该没有问题,并且应该保留滞后补偿。
如果您的服务器方法执行了客户端不应该知道的事情,您还可以在服务器上定义一次该方法,并在客户端上定义一次。同样的效果。