我想在两个Meteor应用之间同步数据.因此,我已经在两个应用程序上发布了带有相关数据的集合(显然,它们运行的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’),而另一台服务器执行了其相应的publish函数中的所有内容,就像客户端一样.
我以这种方式进行了尝试,因为此处https://*.com/a/18360441的发布者提到了类似的用法,可以在客户端和服务器上使用.查看文档中的subscription(http://docs.meteor.com/#meteor_subscribe)表示它仅在客户端上有效,这说明我的服务器上什么也没有发生,但由于DDP.connect(http://docs.meteor.com/#ddp_connect)似乎适用于客户端和服务器,因此有点奇怪.
那我想念这里吗?如果在这种情况下预订确实不起作用,那么在两台服务器之间获得类似预订功能的最佳方法是什么?
我知道我可以使用自定义Meteor.methods,但是相比于subscribe的工作方式,这似乎有点像拐杖,所以我对任何更好的解决方案都非常感兴趣…
解决方法:
就像user728291指出的那样,问题在于服务器在这种情况下不等待另一方的publish函数中的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)});
});