在Meteor

时间:2015-12-05 12:59:11

标签: javascript mongodb meteor

我正在与Meteor合作开发一个项目,我在试图从JavaScript中获取mongodb的数据时遇到了一些问题。我在函数中有以下内容:

console.log(Time.find({today: "Saturday"}).fetch());

在我服务器端的publish.js文件中,我有以下内容:

Meteor.publish("time", function () {
  var currentUserId = this.userId;
  return Time.find({user: currentUserId});
});

在我的订阅文件中,我有以下内容:

Meteor.subscribe("time");

此函数稍后在代码中调用,但它返回一个空数组。如果我在浏览器控制台中运行此代码,则会返回一个包含2个对象的数组,这是正确的。这让我想知道我是否可以在我的代码中使用.fetch()函数?好像我放弃.fetch()它会返回看起来像通常的巨型对象。我真正的问题是我需要.fetch()给我的形式的数据。我认为这是因为函数在数据有机会加载之前被触发,好像我切换出.fetch()对于.count(),它返回0.

有没有办法绕过这个或修复?

1 个答案:

答案 0 :(得分:6)

你在哪里运行那个console.log?

这里有几个基本面,我相信你可能已经掩饰了。

1 Pub / Sub

这就是我们从服务器获取数据的方式,当我们订阅出版物时我变得活跃并开始发送数据,这既不是即时的也不是同步的(想想它更像是打开软管),所以当你运行你的console.log,你可能还没有客户端上的数据。

2个反应上下文

在流星中构建任何东西的一个基本方面是它的反应性。并且它有助于开始考虑反应性和非反应性背景。反应性上下文是每次依赖于更改的数据时重新运行的上下文。使用自动运行(Tracker.autorun或this.autorun insdie模板生命周期回调)或模板帮助程序就是很好的例子。通过将其放在模板助手中,它将在数据可用时重新运行。

Template.Whatever.helpers({
    items: function() {
        // ...do your find here.....
    }
});

由于项目是反应性上下文,根据收集数据,它会在更改时重新运行,使您可以在客户端拥有数据时访问数据。

3检索非活动数据

或者,也可以通过Meteor.call使用流星方法非反应性地检索数据,然后在回调Meteor.call中对结果做一些事情。根据您的行为,Meteor.wrapAsync也可能是您的朋友。

一个简单的例子(从我的头脑中,未经测试):

// on the server
Meteor.methods({
    gimmeStuff: function() {
        return "here is your stuff kind sir!";
    }
});

// on the client
Meteor.call('gimmeStuff', function(err, result) {
    if (err || !result) {
       console.log("there was an error or no result!");
       return false;
    }

    console.log(result);
    return result;
});

4它实际上不需要你.fetch()

  • 如果您在模板中使用此功能,则不需要提取。
  • 如果您希望这是非反应性的,则不需要提取
  • 作为提到的评论者之一,游标只是该数组的包装,为您提供方便的方法和反应。

5回到开始

如果您还没有,我强烈建议您仔细彻底地完成流星网站上的教程,因为它涵盖了解决比这更具挑战性的问题所需的所有基本要素,以及作为示例,教你使用Meteor构建优秀应用程序的所有基本机制。