使用索引访问AJAX JSON属性会在promise中提供undefined

时间:2017-11-16 23:25:09

标签: 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 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 (in promise) TypeError: Cannot read property 'the_question' of undefined

如果我删除了[index],那么我会在控制台中输出问题文本。我也尝试将[index]放在最后console.log(value.the_question[index]);,但接下来我只是在屏幕上看到一个字母。

所以基本上我的MongoDB集合中有两个对象。每个包含the_question字符串,the_choices数组和the_answer字符串。我想在屏幕上一次输出一个问题及其答案选项,但是当我重新加载页面时,我只得到数据库集合中的最后一个问题,并且所有答案选择一次堆叠在一起,即使是应该每个问题不超过3个按钮。当DB中只有一个问题时,它可以正常工作。

DB中的一个问题:

enter image description here

数据库收集中的多个问题:

enter image description here

所以我想使用索引一次输出一个问题,但是在使用它时会出错。怎么了?

我必须提到它工作正常我没有使用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")
]

我的数据库看起来像这样:

enter image description here

编辑:整个前端源代码:

https://codepen.io/Limpuls/pen/rYYLro?editors=1010

1 个答案:

答案 0 :(得分:1)

您可以尝试以下操作,如果这不起作用,请使用控制台日志的输出更新您的问题,以便我们查看您的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(x=>populate());