流星发布方法

时间:2014-08-01 12:10:35

标签: node.js meteor spacebars

我刚开始使用Meteor js,我在发布方法上苦苦挣扎。以下是一种发布方法。

//服务器端

Meteor.publish('topPostsWithTopComments', function() {
  var topPostsCursor = Posts.find({}, {sort: {score: -1}, limit: 30});
  var userIds = topPostsCursor.map(function(p) { return p.userId });

  return [
    topPostsCursor,
    Meteor.users.find({'_id': {$in: userIds}})
  ];
});

//客户端

Meteor.subscribe('topPostsWithTopComments');

现在我没有得到如何在客户端上使用发布数据。我的意思是我想使用由 topPostsWithTopComments

提供的数据

问题详述如下

当新帖子进入前30名时,需要做两件事:

The server needs to send the new post to the client.
The server needs to send that post’s author to the client.

Meteor正在观察第6行返回的帖子光标,因此会在新帖子添加后立即发送,确保客户端会立即收到新帖子。

但是,考虑在第7行返回的Meteor.users游标。即使游标本身是被动的,它现在使用userIds数组的过时值(这是一个普通的非反应变量),这意味着它的结果套装也将过时。

这就是为什么就光标而言,没有必要重新运行查询,Meteor将很乐意继续为最初的30篇热门帖子继续发布相同的30位作者。

因此,除非发布的整个代码再次运行(构造新的userIds列表),否则游标将不再返回正确的信息。

基本上我需要的是:

如果Post中发生任何更改,那么它应该具有更新的用户列表。无需再次调用用户集合。我找到了一些用户完整的mrt模块。     link1 | link2 | link3

请分享您的观点!

-Neelesh

2 个答案:

答案 0 :(得分:1)

当您在服务器上发布数据时,您只是发布允许客户端查询的内容。这是为了安全。订阅发布后,您仍需要查询发布的内容。

if(Meteor.isClient) {
    Meteor.subscribe('topPostsWithTopComments');
    // This returns all the records published with topPostsWithComments from the Posts Collection
    var posts = Posts.find({});
}

如果您只想发布当前用户拥有的帖子,您可能希望在服务器上的发布方法中过滤掉它们,而不是在客户端上。

答案 1 :(得分:0)

我认为@Will Brock已经回答了你的问题,但也许用一个抽象的例子就可以更清楚了。

让我们构建两个名为collectionacollectionb的集合。

// server and client
CollectionA = new Meteor.Collection('collectiona');
CollectionB = new Meteor.Collection('collectionb');

在服务器上,您现在可以分别使用Meteor.publish'collectiona'呼叫'collectionb',以便将两个记录集发布到客户端。这样,客户端也可以单独订阅它们。

但是,您也可以通过在数组中返回多个游标,在一次调用Meteor.publish中发布多个记录集。就像在标准发布过程中一样,您当然可以定义发送给客户端的内容。像这样:

if (Meteor.isServer) {
  Meteor.publish('collectionAandB', function() {
    // constrain records from 'collectiona': limit number of documents to one
    var onlyOneFromCollectionA = CollectionA.find({}, {limit: 1});

    // all cursors in the array are published
    return [
      onlyOneFromCollectionA,
      CollectionB.find()
    ];
  });
}

现在,客户端无需单独订阅'collectiona''collectionb'。相反,您只需订阅'collectionAandB'

if (Meteor.isClient) {
  Meteor.subscribe('collectionAandB', function () {
    // callback to use collection A and B on the client once 
    // they are ready

    // only one document of collection A will be available here
    console.log(CollectionA.find().fetch()); 

    // all documents from collection B will be available here
    console.log(CollectionB.find().fetch());
  });
}

所以我认为您需要了解的是,没有发送到客户端的数组,其中包含Meteor.publish调用中发布的两个游标。这是因为在作为参数传递给函数Meteor.publish的函数中返回一个游标数组只会告诉Meteor发布数组中包含的所有游标。您仍然需要使用客户端上的集合句柄查询各个记录(请参阅@Will Brock的回答)。