Javascript 使用索引访问AJAX JSON属性会导致承诺中未定义的错误
因此,我有一个测验应用程序,它正在使用MongoDB在服务器上与我的API对话 我希望访问其响应索引,如下所示:Javascript 使用索引访问AJAX JSON属性会导致承诺中未定义的错误,javascript,jquery,json,ajax,mongodb,Javascript,Jquery,Json,Ajax,Mongodb,因此,我有一个测验应用程序,它正在使用MongoDB在服务器上与我的API对话 我希望访问其响应索引,如下所示: setTimeout(() => { axios.get('/api/ninjas') .then(function (questions) { var data = questions.data; $.each(data, function(index, value) { /*thequestion = [ new Que
setTimeout(() => {
axios.get('/api/ninjas')
.then(function (questions) {
var data = questions.data;
$.each(data, function(index, value) {
/*thequestion = [
new Question(value.the_question[index], value.the_choices[index], value.the_answer[index])
]*/
console.log(value[index].the_question);
quiz = new Quiz(thequestion)
populate()
})
}), 2000});
但是我得到了Uncaught(承诺中)类型错误:无法读取未定义的属性“the_question”
如果我删除[index]
,那么我会在控制台中获得问题文本。我还试着把[index]
放在最后,就像这样console.log(value.the_-question[index])代码>但是我一次只在屏幕上看到一个字母
基本上,我的MongoDB集合中有两个对象。每个包含\u问题字符串、\u选项数组和\u答案字符串。我想在屏幕上一次输出一个问题及其答案选项,但当我重新加载页面时,我只得到DB集合中的最后一个问题,所有答案选项一次堆叠在一起,即使每个问题不应超过3个按钮。当DB中只有一个问题时,它可以正常工作
DB中的一个问题:
数据库集合中有多个问题:
所以我想使用索引一次输出一个问题,但使用索引时会出错。怎么了
我必须提到,它工作得很好,我没有为此使用DB。只是javascript中的全局变量。就这样,我一次只能问一个问题
let thequestion = [
new Question("Which one of the three is a programming language?", ["Javascript", "HTML", "CSS"], "Javascript"),
new Question("Is NodeJS is a front end or back end framework?", ["Back end", "Front End"], "Back end"),
new Question("Is JAVA object oriented language?", ["Yes", "No"], "Yes")
]
我的数据库如下所示:
编辑:整个前端源代码:
您可以尝试以下方法,如果不行,请使用控制台日志的输出更新您的问题,以便我们可以查看API收到的问题的格式
setTimeout(() => {
axios.get('/api/ninjas')
.then(function (questions) {
console.log(
"received questions:"
,JSON.stringify(questions,undefined,2)
);
quiz = new Quiz(//create a quiz
(questions.data || [])//map question data to Question type
.map(
function (question) {
return new Question(
question.the_question,
question.the_choices,
question.the_answer
);
}
)
);
populate()
})
, 2000
});
你为什么要等2秒钟才能拿到数据?如果这是页面加载,那么您可以尝试$(document)。ready
,但我认为您不必等待document ready开始获取问题(可能仅填充):
应该是值。问题
和循环数组值。选项
。。。或者data[index]。我使用的\u-question
@charlietfl值为值。默认情况下,当我在屏幕上只看到最后一个问题以及第一个和最后一个问题的选项时,显示的是\u-question
。我应该在ajax函数中循环吗?因为我尝试在populate()
函数中循环,如下所示:for(var I=0;I
但我得到:script.js:100 Uncaught(in promise)ReferenceError:value未在populate(script.js:100)中定义
该循环将位于另一个循环的内部loop@charlietflvalue.choices不是数组。你是说value.the_choices吗?很抱歉反应太晚,它工作得很好,谢谢。我仍然不知道你的版本和我的版本有什么不同。在尝试你的代码之前,我已经想出了这个,真是糟糕,它完全没有同样的事情,我每次都会收到一个问题,从第一个问题到最后一个问题,但答案选择按钮仍然会一次全部填充(如果DB中有2个问题,每个问题有3个答案,那么我每个问题会收到6个答案按钮,而不是3个).我看到的唯一区别就是你map@Limpuls测验需要一系列问题,在你的代码中,你可以为每个问题创建一个新的测验。在地图中,我获取所有问题数据,并将它们映射到一个问题
数组,然后将该问题数组传递到新测验
哦,我没有看到这个小错误。谢谢!
$(document).ready(x=>populate());