我知道有几种方法可以在客户端和服务器上共享集合 - 即在顶级lib文件夹或发布/订阅模型中 - 但是当我在使用运行在localhost的mongodb时尝试其中任何一种方法时: 27017作为我的MONGO_URL,我无法在客户端上可靠地获取数据。偶尔console.log(myCollection.findOne({}))
将在浏览器中返回预期的数据,但大多数时候它返回undefined。
//Client side code
Template.controls.onCreated(function controlsOnCreated() {
Meteor.subscribe("myEvents");
Events = new Mongo.Collection("events");
});
//Server side code
Meteor.startup(() => {
Events = new Mongo.Collection("events");
}
Meteor.publish('myEvents', function() {
console.log(Events.find());
return Events.find();
});
UPDATED CODE - 返回服务器上的事件,但不返回客户端:
//Client
Template.controls.onCreated(function controlsOnCreated() {
this.subscribe("myEvents");
});
//Server
if (Meteor.isServer) {
Meteor.publish("myEvents", function() {
return Events.find();
});
}
// /collections/events.js
Events = new Mongo.Collection("events");
更新2:
我尝试在网页呈现后在浏览器中验证发布,并在Chrome开发工具控制台中调用Events.findOne({})
。
答案 0 :(得分:1)
在您的客户端:
Template.controls.onCreated(function controlsOnCreated() {
Meteor.subscribe("myEvents");
Events = new Mongo.Collection("events");
});
这是定义Events变量的奇怪之处。通常,您会将这行代码放在两个平台共有的JS文件中。 e.g。
集合/ events.js:
Events = new Mongo.Collection("events");
当该行在服务器上运行时,它定义mongo集合并创建对它的服务器端引用。当它在客户端上运行时,它会在mini-mongo中通过该名称创建一个集合,并创建一个客户端引用。
你可以这样写你的onCreated(注意“this”而不是“Meteor”):
Template.controls.onCreated(function() {
this.subscribe("myEvents");
});
你没有说客户端在哪里用find()运行你的console.log。如果你在onCreated()中做到了,那太早了。你看到了竞争条件的影响。通常,您可以在帮助器中使用它:
Template.controls.helpers({
events() {
return Events.find({});
}
});
并在视图中显示数据:
{{#each event in events}}
{{event.name}}
{{/each}}
一旦来自发布的数据出现,帮助程序将被动地运行。