当使用现有的mongodb作为MONGO_URL时,如何可靠地将数据从Meteor服务器集合中提取到客户端集合?

时间:2017-01-18 22:26:12

标签: meteor

我知道有几种方法可以在客户端和服务器上共享集合 - 即在顶级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({})

1 个答案:

答案 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}}

一旦来自发布的数据出现,帮助程序将被动地运行。