如何通过DDP连接订阅到服务器端的其他Meteor服务器

How to subscribe via DDP connections to other Meteor servers on the server side?

本文关键字:服务器端 其他 Meteor 服务器 何通过 DDP 连接      更新时间:2023-09-26

我想同步两个流星应用程序之间的数据。因此,我在两个应用程序(显然运行相同的Meteor版本0.8.1.2与完全相同的包)上发布了一个数据集。

运行

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)似乎是指客户端和服务器,并支持订阅。

我错过什么了吗?如果订阅在此场景中确实不起作用,那么在两台服务器之间获得类似订阅功能的最佳方法是什么?我知道我可以用定制的流星。方法,但这似乎有点像拐杖相比如何很好地与订阅工作,所以我将非常感兴趣的任何更好的解决方案…

就像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)});
});