2014-10-12 88 views
0

代码:为什么下面的Meteor/mongodb findOne返回undefined?

Template.chapterForm.rendered = -> 
    Meteor.startup ->  
    currentChapter = Chapters.findOne(
     _id: "Wdyxj8pWg2HPzuDuf" 
    ) 

    console.log currentChapter 
    console.log currentChapter.content 

我得到以下输出:

undefined

Exception from Tracker afterFlush function: Cannot read property 'content' of undefined TypeError:

Cannot read property 'content' of undefined

我不解。它是CoffeScript错误还是Meteor/mongodb错误?

(我试过的代码移动到文件的顶部仍然得到不确定的。)

编辑:

奇怪,如果我做

Chapters.findOne({_id: "Wdyxj8pWg2HPzuDuf"}); 

在我做的控制台获取对象:

Object 
+0

发生这种情况是因为在第一页上呈现数据并未到达客户端,因此该集合为空。稍后,websocket连接将获取剩余的数据,并且调用返回一个对象。 – imslavko 2014-10-12 04:23:12

+0

这是流星编程中最常见的陷阱之一。请参阅[本文](https://dweldon.silvrback.com/guards)获取完整的解释和解决方案。 – 2014-10-12 04:37:00

+0

[Meteor findOne query可能重复在一个模板助手中返回undefined。在其他模板助手中,相同的查询效果不错](http://stackoverflow.com/questions/17728386/meteor-findone-query-returns-undefined-in-one-template-helper-in-other-template) – 2015-03-26 00:41:14

回答

2
  1. 以下两个表达式是在完全的CoffeeScript相同

    Chapters.findOne( _id: “Wdyxj8pWg2HPzuDuf” )

    Chapters.findOne({_ ID: “Wdyxj8pWg2HPzuDuf”})

  2. 我有不知道为什么你在模板实例中使用'Meteor.startup - >',这不是好的方法。在Meteor docs中,“在客户端上,该功能将在DOM准备就绪后立即运行。”因此,findOne操作将在屏幕创建或呈现后立即运行。我认为它可能会破坏Template实例的生命周期顺序,所以只需使用'created'和'rendered'循环。

  3. 此外,从#2开始,在生命周期中,您应该在获取集合(findOne),父母模板或路由器代码之前订阅集合。

所以得出的结论是,你的浏览器mini-mongo中没有数据。 这意味着您需要使用'Chapters.find()。fetch()'命令检查浏览器控制台,然后如果您可以在控制台上看到数据但仍然有相同的错误,则应该检查生命周期以明确订阅。