2014-04-03 66 views
0

說我有一個需要返回文章標題的助手。流星需要多次才能成功讀取數據庫

<template name="articleList"> 
    <span>{{title}}</span> 
</template> 

Template.articleList.title = function() { 
    return Articles.findOne({author: "Billy Bob"}).title 
} 

我經常會得到一個'Can not read property title of undefined'錯誤。所以,當我嘗試調試像這樣

Template.articleList.title = function() { 
    console.log(Articles.findOne({author: "Billy Bob"})) 
} 

日誌會說

undefined 
undefined 
Object[0] 

所以它只能在第三次。我認爲這可能是我的路由器或別的地方的錯誤代碼,但我不知道它是什麼。有什麼建議麼?

+0

發生這種情況是因爲在第一次加載客戶端時,它沒有任何數據。下次它將訂閱出版物。然後它會開始接收數據。閱讀更多關於瞭解何時訂閱已準備就緒的信息:http://docs.meteor.com/#meteor_subscribe – imslavko

+0

所以你說的是,這是無法撤銷的東西?因爲它不會發生在我所有的助手身上。一些助手只需要一次嘗試,其他人需要兩次。 – Nubby

+0

您的其他助手可能正在使用來自'find'的遊標,而不是來自'findOne'的文檔。 – sbking

回答

1

您需要檢查該文件已經被你的訂閱加載。試試這個:

<template name="articleList"> 
    <span>{{title}}</span> 
</template> 
Template.articleList.title = function() { 
    var doc = Articles.findOne({author: "Billy Bob"}); 
    return doc && doc.title; 
}; 

的原因是,如果客戶還沒有收到該文件在DDP中,findOne調用將返回null。當您嘗試撥打null.title時出現錯誤。

+0

所以這不是可以修復的東西我猜 – Nubby

+0

你只需要瞭解流星的工作原理。您的訂閱通過DDP加載到後臺。這是允許您使用同步客戶端收集接口的原因,而不是一堆異步回調。當你使用'findOne'時,你需要記住,相關的結果可能不會被加載到minimongo中。您可以始終使用'limit'選項將'find'設置爲1.這將返回反應*遊標*而不是*文檔*。您也可以始終執行自定義服務器方法調用,但這不會被動。 – sbking

+0

好的,謝謝你的解釋。 – Nubby

0

試試這個:

<template name="articleList"> 
    <span>{{article.title}}</span> 
</template> 

Template.articleList.article = function() { 
    return Articles.findOne({author: "Billy Bob"}); 
} 
+0

我知道這會起作用,但我的問題更多的是爲什麼它需要三次才能返回讀取。 – Nubby

+0

@imslavko解釋說,在你的問題的評論 –

相關問題