我正在与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?
这里有几个fundementals,我相信你可能已经掩饰了.
这就是我们从服务器获取数据的方式,当我们订阅一个出版物时我变得活跃并开始发送数据,这既不是即时的也不是同步的(想想它更像打开软管),所以当你运行你的console.log,您可能还没有客户端上的数据.
在流星中构建任何东西的基本方面之一是它的反应性.并且它有助于开始考虑反应性和非反应性背景.反应性上下文是每次依赖于更改的数据时重新运行的上下文.使用自动运行(Tracker.autorun或this.autorun insdie模板生命周期回调)或模板帮助程序就是很好的例子.通过将其放在模板助手中,它将在数据可用时重新运行.
Template.Whatever.helpers({ items: function() { // ...do your find here..... } });
由于项目是反应性上下文,因此根据收集数据,它会在更改时重新运行,从而允许您在客户端拥有数据时访问数据.
或者,也可以通过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; });
.fetch()
如果您在模板中使用此功能,则无需获取.
如果您希望这是非反应性的,则不需要获取
作为提到的评论者之一,游标只是该数组的包装,为您提供方便的方法和反应.
如果您还没有,我强烈建议您仔细彻底地完成流星网站上的教程,因为它涵盖了解决比这更具挑战性的问题所需的所有基本要素,以及例如,教你使用Meteor构建优秀应用程序的所有基本机制.