答案 0 :(得分:2)
您应该在客户端使用Meteor.call()来调用服务器端方法。 Meteor很棒documentation about methods。
如果Meteor.users()返回客户端的所有用户,则服务器将发布所有用户文档。您是否在安装后删除了流星autopublish package(meteor remove autopublish
)?
答案 1 :(得分:0)
<强> 1。 Meteor.call()强>
Meteor.call()
通常用于从客户端调用服务器端方法。但是,您也可以在服务器端使用Meteor.call()
来调用另一个服务器端函数,但不建议这样做。
因此有两种方法可以使用Meteor.call()
以下是Meteor docs所说的内容:
此方法可以使用Meteor.call从客户端和服务器调用。 请注意,在某些代码的情况下,您应该只使用Method 需要从客户端调用;如果你只想模块化 只会从服务器调用的代码,使用常规代码 JavaScript函数,而不是方法。
<强> 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
- 因为多个订阅将提供两个订阅的联合集。这样,您的客户端迷你mongo中就会有currentUser
+ allUsers
= allUsers
。我们不希望这样。
检查完上述内容后,您可以在客户端代码(或控制台)中使用Meteor.users()
,并发现它只包含当前登录用户的用户数据。
有关Publications and Subscriptions的详细信息,请参阅官方文档。