我正在与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.
有没有办法绕过这个或修复?
答案 0 :(得分:6)
你在哪里运行那个console.log?
这里有几个基本面,我相信你可能已经掩饰了。
这就是我们从服务器获取数据的方式,当我们订阅出版物时我变得活跃并开始发送数据,这既不是即时的也不是同步的(想想它更像是打开软管),所以当你运行你的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构建优秀应用程序的所有基本机制。