Javascript (Meteor)#每个都无法使用MongoDB的数据

Javascript (Meteor)#每个都无法使用MongoDB的数据,javascript,arrays,json,mongodb,meteor,Javascript,Arrays,Json,Mongodb,Meteor,我正在使用Meteor制作一个测试/测验应用程序,并将所有问题、可能的答案等存储在本地MongoDB中,如下所示: { 类型:“someType”, skillType:“someSkillType”, 问题:[ { 问题一:1,, 问题:“一些问题”, 答:二,, 选项1:“一些可能的答案”, 选项2:“另一个”, 备选案文3:“等等。” }, { 问题二,, 问题:“一些问题2”, 答:一,, 选项1:“一些可能的答案”, 选项2:“另一个”, 备选案文3:“等等。” } ] } 等等。我

我正在使用Meteor制作一个测试/测验应用程序,并将所有问题、可能的答案等存储在本地MongoDB中,如下所示:

{
类型:“someType”,
skillType:“someSkillType”,
问题:[
{
问题一:1,,
问题:“一些问题”,
答:二,,
选项1:“一些可能的答案”,
选项2:“另一个”,
备选案文3:“等等。”
},
{
问题二,,
问题:“一些问题2”,
答:一,,
选项1:“一些可能的答案”,
选项2:“另一个”,
备选案文3:“等等。”
}
]
}
等等。我已经测试并确定问题出在我的
Meteor.Collection
Meteor.publish/Meteor.subscribe
或数据库连接上。数据就在那里,我可以从控制台很好地访问它

我的模板如下所示:

但是它不起作用,没有渲染任何内容,我在控制台中遇到一个很长的错误,首先是:

"Exception from Deps recompute function: .observeChanges@.......

如果我直接在模板助手中创建一个静态数组,那么它可以正常工作。我觉得我什么都试过了,但我就是想不出原因。有什么帮助或想法吗?

这看起来像是一种需要添加防护的情况,因为
findOne
可能会在订阅准备就绪之前返回
undefined
。你可以做:

Template.test.testQuestions = function() {
  var aq = allQuestions.findOne({
    type: 'someType',
    skillType: 'someSkillType'
  });

  if (aq && aq.questions) {
    return aq.questions;
  }
};

您不需要使用
EJSON.toJSONValue
转换任何内容。还要注意,
qid
似乎不存在于示例数据中。也许你指的是
questionID

是的,我指的是
questionID
,而不是
qid
——谢谢你指出:)这是数据示例中的一个错误。我刚才也试过你的建议,不幸的是没有成功。我仍然得到同样的(巨大的)错误。那就是。。。太神了它起作用了!对我来说,
if
语句应该有所不同并不是说它真的有意义,但显然它确实有意义。如果可以的话,我会给你全世界的声誉——我一直在为这件事抓狂。再次感谢!太好了-我很高兴我们能成功!要了解更多信息,我还建议您查看以下问题的答案。简短的版本是,将订阅数据获取到客户端需要非零的时间。如果模板在数据准备好之前呈现,则必须使用保护来实现。在使用meteor时,这是一个常见的问题,我希望1.0版的文档能够更清楚地解决这个问题。是的,真不敢相信你这么快就找到了解决方案。我已经想了好几天了。关于你链接到的问题(我以前没见过)。。嗯,这很奇怪,因为我实际上正在使用iron路由器和
waitOn:function(){return Meteor.subscribe('example')}
来处理所有非全局订阅。直到我使用了你的解决方案,我才开始工作。
Template.test.testQuestions = function() {
  var aq = allQuestions.findOne({
    type: 'someType',
    skillType: 'someSkillType'
  });

  if (aq && aq.questions) {
    return aq.questions;
  }
};