在这种情况下,主要是对 Meteor 数据模型的误解。
尽管可以使用方法调用发送数据,但通常您需要使用出版物和订阅 https://docs.meteor.com/#/full/meteor_publish向客户端发送数据。这些具有查询几乎神奇的属性live- 也就是说,查询的任何更新都将自动发送到客户端。您当前的代码如果工作正常,将不会有实时数据。具体问题是Meteor.call
是异步的,因此您的消息助手不会看到任何内容。
相反,这就是您想要做的。在服务器上,您将设置一个出版物消息集合:
Meteor.publish("someWeirdName", function() {
return Messages.find({},{ sort: { timestamp:-1}, limit: 20});
});
请注意与您的代码的差异:没有fetch()
,因为我们想要一个实时光标,并且20
可能是您想要的限制选项。请注意,我也称之为someWeirdName
因为那是的名字出版物,而不是您将用于在客户端上订阅的集合。如需更详细的解释,您可能想查看这个帖子 https://stackoverflow.com/a/18880927/586086.
然后,在客户端,您只需要以下内容:
Meteor.subscribe("someWeirdName");
Template.messages.helpers({
showMessages: function(){
return Messages.find();
}
});
请注意,您之前的调用Meteor.subscribe("Messages")
什么也没做,因为没有名为Messages
。此外,我们将使用客户端消息缓存来创建光标来显示消息。
此外,所有这些代码都要求您在服务器和客户端上声明以下内容:
Messages = new Mongo.Collection("callMeWhateverYouWant");
另请注意,用于实例化此集合的参数与您在代码中引用该集合的方式无关,除非您正在编写一个定制出版物 https://stackoverflow.com/a/18880927/586086。它只是识别底层数据库中的集合。