2016-08-30 63 views
1
  1. 何时仅对客户端或服务器端请求使用Meteor.call()方法。请指教
  2. 在我的应用程序Meteor.users()显示控制台中的所有用户。如何禁用此功能。

回答

2
  1. 你应该在客户端使用Meteor.call()调用服务器端方法。流星有真棒documentation about methods

  2. 如果Meteor.users()返回客户端的所有用户,则服务器将发布所有用户文档。安装后您是否移除了流星autopublish packagemeteor remove autopublish)?

+0

我已经删除自动发布仍然发布所有集合 –

+0

如果您已经删除了该软件包,情况就不是这样,除非另有软件包发布用户集合。你介意分享你的.meteor/versions文件,并确保你没有任何通过Meteor.publish('users')发布用户集合的服务器端代码? – Matt

0

1. Meteor.call()

Meteor.call()通常用于调用从客户机侧的服务器端方法。但是,您也可以在服务器端使用Meteor.call()来调用另一个服务器端函数,但不建议这样做。

所以有使用Meteor.call()

  • 客户端到服务器的呼叫(好习惯)
  • 服务器到服务器的呼叫两种方式(不是好的做法,但它的工作原理)

这里什么流星docs说,在捏:

这种方法可以从c lient和服务器使用Meteor.call。 请注意,只有在需要从客户端调用某些代码 的情况下,才应该使用方法;如果您只想模块化 代码,该代码只能从服务器调用,请使用常规的 JavaScript函数,而不是Method。

2的发布和订阅

为了确保您的数据是安全的,你需要删除autopublishinsecure包。这将禁用您的集合的自动发布,也禁止从客户端对数据库进行免费写入访问。

现在,为了确保您只发布尽可能多的部分集合,您需要设置您的出版物(或检查它们,如果它们已经设置)。

出版物:这是什么提供您的数据库集合,从服务器到客户端。

这将是这个样子,看它在您apiserver文件夹,您的项目中:

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的更多详细信息,请参阅官方文档。