Express和MySQL服务器响应不发送所有必需的数据

时间:2017-08-17 11:15:08

标签: mysql node.js express asynchronous promise

我正在尝试查询数据库以查找我正在使用的用于教授和培训用户的项目。我有两个承诺,一个根据用户类型(例如医生)查询数据库中的问题(和他们的question_ids),然后下一个查询获取questions_ids,并选择相应的答案和answer_ids到问题。代码如下所示:

textview

我的预期回答是针对user_type的医生,针对"问题"的两个不同问题。 "答案"中的八个答案(每个不同问题的四个答案)。但是,我只得到第一个问题的四个答案,而不是第二个问题的四个答案。我查看了代码并查看了异步执行,但似乎无法找到我的问题。

2 个答案:

答案 0 :(得分:0)

我找到了解决方案,只是添加了一个if语句,以确保问题数组的长度是所需的长度:

function getAnswers(question_ids){
  console.log(question_ids)
  return new Promise((resolve, reject) => {
    for (i = 0; i < question_ids.length; i++){
      connection.query(sql_command_2, question_ids[i], function(error, results){
      for (i = 0; i < results.length; i++){
        answers.push(results[i].answer_text);
        answer_ids.push(results[i].answer_id)
      }
      if (answer_ids.length == (4 * question_ids.length)){
        console.log(answers)
        console.log(answer_ids)
        resolve({answers: answers, answer_ids: answer_ids})
    }
    })
   }
  }
)}

答案 1 :(得分:0)

好的,

我将向您解释您的代码有什么问题,但首先我想建议您构建应用程序的另一种方法 - 在单个查询中获取所有数据

SELECT * FROM questions q 
LEFT JOIN answers a ON q.question_id = a.question_id
WHERE q.type = ?

这个 SQL 将为您提供8条记录作为回复,如下所示:

question_id |  type  |  question  | answer_id | answer | .... all columns
1             doctor    question?       3        a       .......
1             doctor    question?       4        b       .......
1             doctor    question?       5        c       .......
1             doctor    question?       6        d       .......
2             doctor    question2?      11       ff      .......
2             doctor    question2?      12       gg      .......
2             doctor    question2?      13       hh      .......
2             doctor    question2?      14       mm      .......

然后您只需对nodejs中的数据进行排序 - 这样您只会进行一次数据库调用

使用您的方法,您将向数据库发出一个请求以获取所有问题,并在每个问题中再提出一个请求以获得答案 - 在您描述的方案中总共3个请求。想象一下,你想要提取50个问题的答案 - 然后你会做50个请求......

现在...... 让我们查看您的代码。

首先,我看到嵌套的for循环使用相同的索引变量名称 - i 从不这样做

// This is a completely WRONG code
for (i = 0; i < question_ids.length; i++) {
    ...
    for (i = 0; i < results.length; i++) {
        ...
    }
    ...
}

下一步

  

但是,我只得到第一个问题的四个答案,   不是第二个四个。

是的,这是正确的,因为在getAnswers()方法中,您解析您对第一个数据库响应的承诺。在这种情况下,您可以创建一个Promise数组并使用Promise.all(),代码将如下所示:

function getAnswers(question_ids) {

    var promises = [];

    for (var i = 0; i < question_ids.length; i++) {
        promise = new Promise((resolve, reject) => {
            connection.query(sql_command_2, question_ids[i], function (error, results) {
                for (var j = 0; j < results.length; j++) { // change index with another letter here - j
                    answers.push(results[i].answer_text);
                    answer_ids.push(results[i].answer_id)
                }
                resolve();
            })
        });
        promises.push(promise);
    }

    return Promise.all(promises);
}

如果有什么不清楚,请告诉我。祝你好运!