Meteor需要多次才能成功读取数据库

Meteor需要多次才能成功读取数据库,meteor,Meteor,假设我有一个需要返回文章标题的助手 <template name="articleList"> <span>{{title}}</span> </template> Template.articleList.title = function () { return Articles.findOne({author: "Billy Bob"}).title } 日志会说 undefined undefined Object[0]

假设我有一个需要返回文章标题的助手

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

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

undefined
undefined
Object[0]
所以它只在第三次起作用。我想它可能是我的路由器或其他地方的坏代码,但我不知道它是什么。有什么建议吗?

试试这个:

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

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

{{文章标题}
Template.articleList.article=函数(){
returnarticles.findOne({author:“Billy Bob”});
}

您需要检查您的订阅是否已加载文档。试试这个:


{{title}}
Template.articleList.title=函数(){
var doc=Articles.findOne({作者:“Billy Bob”});
返回文档(&doc.title);
};

原因是,如果客户端尚未通过DDP接收到文档,
findOne
调用将返回
null
。当您尝试调用
null.title

时会出现错误,因为在第一次加载客户端时,它还没有任何数据。下次它将订阅一份出版物。然后它将开始接收数据。在这里阅读更多关于了解订阅何时准备就绪的信息:那么您的意思是它是无法撤消的?因为这并不是所有我的助手都能做到的。某些帮助程序只需要一次尝试,而其他帮助程序则需要两次尝试。您的其他帮助程序可能正在使用
find
中的游标,而不是
findOne
中的文档。我是说这是一种结构化设计的行为。我知道这会起作用,但我的问题更多的是关于为什么需要三次才能返回一个读数。@imslavko解释说,在对你的问题的评论中,这不是可以解决的问题,我想你只需要了解Meteor是如何工作的。您的订阅将通过DDP在后台加载。这就是允许您使用同步客户端收集接口的原因,而不是使用一堆异步回调。使用
findOne
时,您需要记住,相关结果可能尚未加载到minimongo中。将
limit
选项设置为1时,您始终可以执行
find
。这将返回一个被动游标,而不是一个文档。您也可以始终执行自定义服务器方法调用,但这不是被动的。
<template name="articleList">
    <span>{{article.title}}</span>
</template>

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