2013-02-02 112 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}) 
}) 
相關問題