2014-10-12 36 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()'命令檢查瀏覽器控制檯,然後如果您可以在控制檯上看到數據但仍然有相同的錯誤,則應該檢查生命週期以明確訂閱。