在没有模板的情况下访问Meteor中的mongodb集合

时间:2015-08-22 12:55:39

标签: javascript json mongodb meteor

我有一个集合,其中包含我从JSON文件中带来的一些数据:Data.insert( JSON.parse(Assets.getText('data.json')) );。我想创建一个包含JS文件中不属于模板的所有数据的var。

我应该var data = Data.find({}).fetch()[0]吗? 有时候fetch返回为空,我得undefined所以我猜这不是最好的方法。什么是正确的方法?

1 个答案:

答案 0 :(得分:1)

在您拨打find时,听起来数据并不总是存在(另外,您可以使用findOne)。

根据您对该问题的评论,您可能希望将调用find的函数放在Tracker.autorun()中,以便在新数据进入时更新您的变量。如果该代码不在一个模板助手,当数据从服务器进入时,它不会重新运行。如果模板中的某些内容依赖于它,那么将它放在模板中的帮助器中可能是有意义的。

或者,如果在服务器启动后数据不会更改,那么您可以使用发布和订阅机制在服务器上加载数据ready()后声明,然后在{{1}中进行客户端后处理你的onReady()函数中的回调,类似于:

在服务器上:

subscribe()

在客户端:

Meteor.publish("startupData", function (){ 
    if (!this.userId) 
        return this.ready();
    else 
        return StartUpData.find({userId: this.userId});
}

此外,在后一种情况下(不变的初始数据),您需要确保在数据到达之前,任何依赖于数据的模板都不会呈现。我过去使用IronRouter的var startupData; Meteor.subscribe("startupData", function(){ var initStartupData = StartUpData.find({}) //will get all the published data for this user startupData = doPostProcessing(initStartupData) } 功能处理了这个案例,如下所示:

waiton

话虽如此......如果有一个依赖于某些数据的模板,通常这表明数据应该在该模板的帮助器中提供,或者作为模板的数据上下文提供。当流量数据到达/发生变化时,Meteor将自动处理重新渲染。