我刚开始使用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
答案 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已经回答了你的问题,但也许用一个抽象的例子就可以更清楚了。
让我们构建两个名为collectiona
和collectionb
的集合。
// 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的回答)。