Javascript (Meteor)#每个都无法使用MongoDB的数据
我正在使用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:“等等。” } ] } 等等。我
{
类型:“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;
}
};