如何在Meteor.js上同步客户端和服务器集合

时间:2013-02-02 06:23:53

标签: meteor

我正在尝试将我的服务器集合与我的客户端集合同步。

在服务器上:

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())

在客户端上我得到一个空数组。

如何同步这两个系列?

Meteor Docs说:

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

我是否需要进行自动订阅?

2 个答案:

答案 0 :(得分:2)

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

要修复此尝试并更改:

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

除非您因某种原因需要更改订阅,否则您无需进行自动订阅

您可能也会过早致电console.log( JobLoopUsers.find().fetch()),请等待一两秒钟,将其替换为:

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

答案 1 :(得分: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})
})