javascript - 在 Meteor 的函数中使用 .find().fetch()

标签 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。

有什么解决办法或修复方法吗?

最佳答案

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

我相信您可能已经忽略了这里的几个基本原理。

1 个发布/订阅

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

2 react 上下文

在 meteor 中构建任何东西的一个基本方面是它的 react 性。它有助于开始根据 react 性和非 react 性上下文进行思考。响应式(Reactive)上下文是每次它所依赖的数据发生变化时重新运行的上下文。使用自动运行(Tracker.autorun 或 this.autorun 独立于模板生命周期回调)或模板助手是很好的例子。通过将其放置在模板助手中,它将在数据可用时重新运行。

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

由于项目是一个响应式(Reactive)上下文,它取决于收集的数据,当数据发生变化时它会重新运行,让您可以在客户端拥有数据时访问这些数据。

3 检索非 react 性数据

或者,也可以通过使用 Meteor.call 和 meteor 方法以非 react 方式检索数据,然后在 Meteor.call 的回调中对结果做一些事情。根据您正在做的事情,Meteor.wrapAsync 也可能是您的 friend 。

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

// 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()

  • 如果您在模板中使用它,则不需要提取。
  • 如果您希望它是非 react 性的,则不需要获取
  • 正如其中一位评论者所提到的,游标只是该数组的包装器,为您提供方便的方法和 react 性。

5 回到起点

如果您还没有,我强烈建议您仔细、彻底地学习 meteor 站点上的教程,因为它涵盖了解决比这更具挑战性的问题所需的所有基本要素,以及,通过示例,教您使用 Meteor 构建出色应用程序的所有基 native 制。

关于javascript - 在 Meteor 的函数中使用 .find().fetch(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34105175/

相关文章:

javascript - 传递值以仅打印、pdf 预览或在 excel 中打开

javascript - 实时过滤json

javascript - Meteor Mongo - 使用 $inc 和 upsert 不会增加值(value)

javascript - 如何更改导航栏中的当前链接颜色

javascript - 使用javascript通过https(通过客户端证书进行身份验证)连接到soap web服务

javascript - 我如何从段落元素中获取姓氏

javascript - 错误: Can't set headers after they are sent from a forEach loop

node.js - 使用 MomentJS 作为 MongoDB 文档中的默认日期

mongodb - 在MongoDB中查找文档,该文档的数组字段是查询数组的子集

javascript - 在 Meteor 的 onCreated 中获取模板变量