数据库项有时不会出现在Meteor.js中

时间:2013-08-11 00:33:59

标签: javascript mongodb meteor

我在这里用流星写的一个简单的应用程序:https://gist.github.com/drew-gross/6202629有问题。调用Template.tab.ordered_drinks函数时,未找到任何选项卡(Tabs.find({}).fetch()返回空数组)但仅在大多数情况下。有时Tabs在那里。我已经检查过它们是否存在于数据库中。

重现:

1)运行应用程序。 (需要流星路由器)

2)在控制台上创建一个标签:Tabs.insert({owner:"foo"})

3)尝试查看标签页:localhost:3000/tabs/:id

页面可以正常工作,看似随意。要确认,您可以在.js的第9行或第19行设置断点并执行Tabs.find({}).fetch(),有时您会看到并且有时看不到标签。

这有点似乎是Meteor中的一个错误,但我想我会首先检查一下我是否可能做错了。

浏览器:Chrome 28 流星版:发布0.6.4.1 节点版本:v0.10.15

1 个答案:

答案 0 :(得分:1)

如果订阅尚未获得数据,则可能会出现问题。

在meteor中,html / js被发送到客户端,然后呈现页面。同时客户端通过websockets / long轮询连接到服务器以检索mongo数据库。

因此,有时您可以在数据库中没有任何内容的情况下呈现html。

你只需要小心你在数据到达时使用反应来处理,而不是假设它已经在那里,就像这里:

Template.tab.ordered_drinks = function () {
    return Tabs.findOne(Session.get('tabId')).ordered_drinks;
};

如果Tabs.findOne(Session.get('tabId'))null,因为客户端上还没有任何数据,那么.ordered_drinks就不存在了,你会在chrome console&有时看/有时看不到标签,取决于数据库是否已加载。

尝试更改下面的行以允许Tabs.findOne(Session.get('tabId'))null而不会抛出错误。

Template.tab.ordered_drinks = function () {
    var tab = Tabs.findOne(Session.get('tabId'));
    return tab && tab.ordered_drinks;
};

所以此时正在加载。一旦数据到达,它将立即用标签重新呈现此部分。