我应该为每个集合使用一个发布还是多个?
Should I use one publish per collection or several?
我正在开发用户组系统。每个组都有几个功能,我希望与组集合的交互尽可能安全和简单,因为它仍处于早期阶段。
现在,我在我的网站上有一个组部分,我在其中使用了多个嵌套页面。该部分的目的是允许用户进入一个组,如果该组是私有的则请求成员资格,浏览一个组对象等。
例如,在我的组部分中,我可以在 yield 中加载 "see all groups" 页面、"create a new group" 页面或 "see only my groups"(我所属的页面)或"view group" 获取群组详情。
我的第一个方法是为每个子页面创建一个 controller.js
文件,它调用一个为子页面需求定制的订阅。例如,我有一个 'all_group' publication/subscription 用于 "see all groups" 子页面,一个 "my_groups" 用于 "see only my groups" 子页面。
但这变得非常混乱。此外,我在 both 文件夹中声明了我的 "group" 集合,因此我不确定是否了解客户端可用数据的来源。
既然我已经解释了情况,那么我的问题是:
- 当我在客户端上执行
console.table(Groups.find().fetch());
时,我看到了不应该存在的字段(即我当前的出版物或任何其他出版物都没有返回)。那是因为我在客户端声明了 "group" 集合吗?如何解决?
- 我是否应该摆脱所有这些出版物,只创建一个包含允许客户看到的所有内容的出版物?然后我会从组部分页面控制器订阅它并使用一组数据。
- 我是否应该使用 allow/deny 规则简单地阻止来自客户端的任何 insert/update/remove 并仅使用这些方法?
- 是否可以 safe/advised 将我的方法放在
both
文件夹中,这样我就不会失去延迟补偿功能?
编辑
好吧,我吓坏了,因为我的所有收集数据都在客户端,但这只是发布中的一个错误查询(我同时使用了 field:1
和 field:0
投影)。
还有两个问题:
- 如果我使用方法,我假设我不必拒绝本机驱动程序中的所有内容,我只需要比方法允许的限制更多,对吗?
- 如果我把我的方法放在两个文件夹中,它会同时在客户端和服务器上执行,所以在 "client offline" 上下文中,即使客户端弄乱了我的方法,服务器也应该回滚更改如果客户端结果与他的不同(假设无法使用允许拒绝规则完成更改)?即使使用这些方法,我也会有延迟补偿吗?
为了更好地控制和可视化您的订阅,您可以使用 msavin:mongol
。
创建一个包罗万象的发布在性能方面并不是一个好主意(将所有数据发送给所有客户端将对所有相关人员造成痛苦)。
如果您使用方法并删除了 autopublish
,那么是的,一切都会被拒绝...除了对用户个人资料的更新。您可能也想手动拒绝。
对于方法和收集规则,您应该共享验证代码。这样,客户端和服务器以相同的方式验证(并且应该始终得出相同的结果),因此除非您的客户端搞砸了控制台,否则应该没有问题并且应该保留滞后补偿。
如果你的服务器方法做了一些客户端不应该知道的事情,你也可以在服务器上定义一次方法,然后在客户端上定义一次。同样的效果。
我正在开发用户组系统。每个组都有几个功能,我希望与组集合的交互尽可能安全和简单,因为它仍处于早期阶段。
现在,我在我的网站上有一个组部分,我在其中使用了多个嵌套页面。该部分的目的是允许用户进入一个组,如果该组是私有的则请求成员资格,浏览一个组对象等。
例如,在我的组部分中,我可以在 yield 中加载 "see all groups" 页面、"create a new group" 页面或 "see only my groups"(我所属的页面)或"view group" 获取群组详情。
我的第一个方法是为每个子页面创建一个 controller.js
文件,它调用一个为子页面需求定制的订阅。例如,我有一个 'all_group' publication/subscription 用于 "see all groups" 子页面,一个 "my_groups" 用于 "see only my groups" 子页面。
但这变得非常混乱。此外,我在 both 文件夹中声明了我的 "group" 集合,因此我不确定是否了解客户端可用数据的来源。
既然我已经解释了情况,那么我的问题是:
- 当我在客户端上执行
console.table(Groups.find().fetch());
时,我看到了不应该存在的字段(即我当前的出版物或任何其他出版物都没有返回)。那是因为我在客户端声明了 "group" 集合吗?如何解决? - 我是否应该摆脱所有这些出版物,只创建一个包含允许客户看到的所有内容的出版物?然后我会从组部分页面控制器订阅它并使用一组数据。
- 我是否应该使用 allow/deny 规则简单地阻止来自客户端的任何 insert/update/remove 并仅使用这些方法?
- 是否可以 safe/advised 将我的方法放在
both
文件夹中,这样我就不会失去延迟补偿功能?
编辑
好吧,我吓坏了,因为我的所有收集数据都在客户端,但这只是发布中的一个错误查询(我同时使用了 field:1
和 field:0
投影)。
还有两个问题:
- 如果我使用方法,我假设我不必拒绝本机驱动程序中的所有内容,我只需要比方法允许的限制更多,对吗?
- 如果我把我的方法放在两个文件夹中,它会同时在客户端和服务器上执行,所以在 "client offline" 上下文中,即使客户端弄乱了我的方法,服务器也应该回滚更改如果客户端结果与他的不同(假设无法使用允许拒绝规则完成更改)?即使使用这些方法,我也会有延迟补偿吗?
为了更好地控制和可视化您的订阅,您可以使用 msavin:mongol
。
创建一个包罗万象的发布在性能方面并不是一个好主意(将所有数据发送给所有客户端将对所有相关人员造成痛苦)。
如果您使用方法并删除了 autopublish
,那么是的,一切都会被拒绝...除了对用户个人资料的更新。您可能也想手动拒绝。
对于方法和收集规则,您应该共享验证代码。这样,客户端和服务器以相同的方式验证(并且应该始终得出相同的结果),因此除非您的客户端搞砸了控制台,否则应该没有问题并且应该保留滞后补偿。
如果你的服务器方法做了一些客户端不应该知道的事情,你也可以在服务器上定义一次方法,然后在客户端上定义一次。同样的效果。