2013-02-02 161 views
2

我正尝试将我的服务器集合与我的客户端集合同步。如何同步Meteor.js上的客户端和服务器集合

在服务器上:

var JobLoopUsers = new Meteor.Collection("job-loop-users") 

Meteor.publish("user-data", function(){ 
    JobLoopUsers.findOne({meteorUserId : 1}); 
}); 

在客户端:

Meteor.subscribe("user-data"); 

JobLoopUsers = new Meteor.Collection("job-loop-users"); 

我使用meteor.call

在服务器上,当我做

插入服务器上的一些测试数据
console.log(JobLoopUsers.find().fetch()[0]) 

它显示:

{meteorUserId: 1 
    testData: "My Test Data Here"} 

当我的客户我刚得到一个空数组做

console.log(JobLoopUsers.find().fetch()) 

如何同步这两个集合?

流星文档说:

当您订阅一个记录集,它告诉服务器发送记录到客户端。客户端将这些记录存储在本地Minimongo集合中,并使用与要设置的集合参数相同的名称。 Meteor将对传入的属性进行排队,直到您在客户端上使用匹配的集合名称声明Meteor.Collection。

我需要做自动订阅吗?

回答

2

这两个实时自动同步。可能发生的情况是,您插入的数据没有meteorUserId:1,它不会发布到客户端,并且您正在搜索所有记录,不管它们是否具有meteorUserId:1

要解决这个问题的尝试和改变:

Meteor.publish("user-data", function(){ 
    JobLoopUsers.find({}); 
}); 

您不必除非您需要订阅出于某种原因更改

您也可以太早打电话console.log(JobLoopUsers.find().fetch())做一个autosubscribe,尝试等待一两秒钟,将其替换为:

Meteor.setTimeout(function() { console.log(JobLoopUsers.find().fetch()) }, 3000); 
+1

在客户端仍然一无所获。也许我是错误地命名了一些东西?为了安全,我已经删除了autopublish包。 – ChickenFur

+0

更新了我的答案,或许它的客户端是异步的,并且您正在尽快调用该函数 – Akshat

+0

是的,我知道一个事实,问题在于此调用“Meteor.subscribe(”user-data“);> >不同步(尽管它看起来是同步的)......这意味着客户端上的“JobLoopUsers.find()。fetch())”行将在订阅完成后才会返回任何内容。这是流星的一个非常普遍的问题,我希望他们找到解决办法。 –

1

这里继教程帮助我解决我的问题:http://andrewscala.com/meteor/

它似乎在工作。

Global.js:

JobLoopUsers = new Meteor.Collection("user-data"); 

Client.js:

Meteor.autosubscribe(function(){ 
    Meteor.subscribe("user-data", Meteor.userId()) 
}) 

Server.js:

Meteor.publish("user-data", function(userId){ 
    return JobLoopUsers.find({meteorUserId: userId}) 
}) 
相关问题