Meteor.call()方法 - Meteor.js
- 何时仅对客户端或服务器端请求使用Meteor.call()方法。请指教
- 在我的应用程序Meteor.users()显示控制台中的所有用户。如何禁用此功能。
你应该在客户端使用Meteor.call()调用服务器端方法。流星有真棒documentation about methods。
如果Meteor.users()返回客户端的所有用户,则服务器将发布所有用户文档。安装后您是否移除了流星autopublish package(
meteor remove autopublish
)?
1. Meteor.call()
Meteor.call()
通常用于调用从客户机侧的服务器端方法。但是,您也可以在服务器端使用Meteor.call()
来调用另一个服务器端函数,但不建议这样做。
所以有使用Meteor.call()
- 客户端到服务器的呼叫(好习惯)
- 服务器到服务器的呼叫两种方式(不是好的做法,但它的工作原理)
这里什么流星docs说,在捏:
这种方法可以从c lient和服务器使用Meteor.call。 请注意,只有在需要从客户端调用某些代码 的情况下,才应该使用方法;如果您只想模块化 代码,该代码只能从服务器调用,请使用常规的 JavaScript函数,而不是Method。
2的发布和订阅
为了确保您的数据是安全的,你需要删除autopublish
和insecure
包。这将禁用您的集合的自动发布,也禁止从客户端对数据库进行免费写入访问。
现在,为了确保您只发布尽可能多的部分集合,您需要设置您的出版物(或检查它们,如果它们已经设置)。
出版物:这是什么提供您的数据库集合,从服务器到客户端。
这将是这个样子,看它在您api
或server
文件夹,您的项目中:
Meteor.publish('allUsers', function() {
if (!this.userId) {
return this.ready();
}
return Meteor.users.find({});
});
注意,在上面的例子中,我们并没有在MongoDB中调用提供的任何滤波器参数,所以此发布将返回一个包含数据库中所有用户的游标。现在
Meteor.publish('currentUser', function() {
if (!this.userId) {
return this.ready();
}
return Meteor.users.find({
_id: this.userId
});
});
本出版物中,我们提供了用户_id
字段作为过滤器。所以这将返回一个光标Meteor.users()
只有当前用户对象作为可用项目。
订阅:要访问您的出版物,则需要相应地呼吁您的客户端代码订阅,这样的:
Meteor.subscribe('currentUser');
请确保您有不同时订阅allUsers
- - 因为多个订阅将提供两个订阅的联合集。这样,您的客户端mini-mongo中将有currentUser
+ allUsers
= allUsers
。我们不希望这样。
检查完上述内容后,您可以在客户端代码(或控制台)中使用Meteor.users()
,并发现它只包含当前登录用户的用户数据。
有关Publications and Subscriptions的更多详细信息,请参阅官方文档。
我已经删除自动发布仍然发布所有集合 –
如果您已经删除了该软件包,情况就不是这样,除非另有软件包发布用户集合。你介意分享你的.meteor/versions文件,并确保你没有任何通过Meteor.publish('users')发布用户集合的服务器端代码? – Matt