Meteor.call()方法 - Meteor.js

时间:2016-08-30 14:15:06

标签: meteor meteor-blaze meteor-accounts meteor-autoform

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

2 个答案:

答案 0 :(得分:2)

  1. 您应该在客户端使用Meteor.call()来调用服务器端方法。 Meteor很棒documentation about methods

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

答案 1 :(得分:0)

<强> 1。 Meteor.call()

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

因此有两种方法可以使用Meteor.call()

  • 客户端到服务器调用(良好做法)
  • 服务器到服务器调用(不是很好的做法,但它有效)

以下是Meteor docs所说的内容:

  

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

<强> 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 - 因为多个订阅将提供两个订阅的联合集。这样,您的客户端迷你mongo中就会有currentUser + allUsers = allUsers。我们不希望这样。

检查完上述内容后,您可以在客户端代码(或控制台)中使用Meteor.users(),并发现它只包含当前登录用户的用户数据。

有关Publications and Subscriptions的详细信息,请参阅官方文档。