2014-05-22 136 views
3

我想在兩個Meteor應用程序之間同步數據。因此,我已經在兩個應用程序上發佈了一個包含相關數據的集合(顯然,它們使用完全相同的包運行相同的Meteor版本0.8.1.2)。如何通過DDP連接訂閱服務器端的其他Meteor服務器?

當我的任何客戶端上運行

var testConnection = DDP.connect('http://10.0.10.20:3003/'); 
var newCollection = new Meteor.Collection('remoteData', testConnection); 
testConnection.subscribe('remoteData'); 
console.log('Data list starts here:'); 
newCollection.find().forEach(function(data){console.log(data)}); 

我得到的所有數據的列表像預期。服務器端沒有任何東西,所以newCollection保持爲空(我也從調試中知道服務器確實執行了testConnection.subscribe('remoteData'),而另一個服務器執行與其對應的發佈函數中的所有內容,就像客戶端一樣)。

我試過這種方式,因爲這裏的海報https://stackoverflow.com/a/18360441提到了這樣的東西在客戶端和服務器上的作品。查看訂閱文檔(http://docs.meteor.com/#meteor_subscribe)它說它只適用於客戶端,這將解釋我的服務器上沒有任何反應,但會有點奇怪,因爲DDP.connect(http://docs.meteor.com/#ddp_connect)似乎是爲了客戶端和服務器,並且支持訂閱。

那麼我在這裏想念什麼?如果訂閱在這種情況下無法正常工作,那麼在兩臺服務器之間獲得訂閱功能的最佳方式是什麼? 我知道我可以使用自定義Meteor.methods,但這似乎有點像柺杖相比,它會與訂閱有多好,所以我會非常感興趣的任何更好的解決方案...

+0

也許嘗試'newCollection.find()'回調內部認購,以確保你只是沒有查詢集合有數據之前。我有點驚訝的是,客戶端的集合也不是空的,也沒有任何回調或等待的需要。 – user728291

+0

哦,男人,非常感謝!你的建議可以和Meteor.setTimeout或其他任何東西等待一段時間。也許在客戶端find()總是等待一個集合ready()?我不知道,但因爲它在客戶端上工作,我沒有想到這個問題就是這樣的...... –

+0

令人驚訝的是,當使用'autopublish'包時,不需要在回調中執行'.find()' – Nyxynyx

回答

3

Like user728291指出問題在於,在這種情況下,服務器沒有在另一端的發佈函數中等待this.ready(),因此當在服務器上調用newCollection.find()時,newCollection仍然是空的(但會很快接收數據後)。看起來在客戶端newCollection.find()試圖等待服務器的發佈函數this.ready()(我也絕對不確定這個,也許它在客戶端上工作的原因是完全不同的)因此在客戶端當時它不是空的。

無論如何,當你總是在訂閱的回調中觸發find()時,你會處於安全的一邊,這會將任何函數解釋爲onReady回調(http://docs.meteor.com/#meteor_subscribe)。

那麼保證在服務器和客戶端的作品是

var testConnection = DDP.connect('http://10.0.10.20:3003/'); 
var newCollection = new Meteor.Collection('remoteData', testConnection); 
testConnection.subscribe('remoteData', function() { 
    console.log('Data list starts here:'); 
    newCollection.find().forEach(function(data){console.log(data)}); 
});