2017-08-17 84 views
0

我想查询数据库中,我对工作项目的快速和MySQL服务器响应用于教学和培训用户。我有根据用户(例如医生)的两个型诺言,一个询问的问题(和它们的question_ids)的数据库,然后接下来的查询需要的questions_ids,并选择相应的答案和answer_ids的问题。代码如下所示:不发送所有需要的数据

var express = require('express'); 
var mysql = require('mysql'); 
var path = require('path'); 
var async = require('async') 

var app = express(); 

var connection = mysql.createConnection({ 
    host: "localhost", 
    user: "root", 
    password: "123456", 
    database: "myDB" 
}) 

app.set('port', 3001); 

var questions = []; 
var question_ids = []; 
var answers = []; 
var answer_ids = [] 

app.get('/training/:user_type', function (req, res) { 
    var user_type = req.params.user_type // gets the value for the named parameter user_id from the url 
    var sql_command_1 = "SELECT * FROM questions WHERE type = ?" 
    var sql_command_2 = "SELECT * FROM answers WHERE question_id = ?" 

    function getQuestions() { 
     return new Promise((resolve, reject) => { 
      connection.query(sql_command_1, user_type, function (error, results) { 
       for (i = 0; i < results.length; i++) { 
        questions.push(results[i].question_text); 
        question_ids.push(results[i].question_id); 
       } 
       resolve({questions: questions, question_ids: question_ids}); 
      }) 
     }) 
    } 

    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); 
        } 
        console.log(answers); 
        console.log(answer_ids); 
        resolve({answers: answers, answer_ids: answer_ids}); 
       }); 
      } 
     }); 
    } 


    getQuestions().then((result) => { 
     console.log(result); 
     return getAnswers(result.question_ids); 
    }).then((result) => { 
     res.json({"Type": user_type, "Questions": questions, "Answers": answers}); 
    }); 
}); 

app.listen(app.get('port')); 

我预期的响应是医生为USER_TYPE,对于“问题”等8个答案在“答案”两个不同的问题(四个答案为每个不同的问题)。不过,我只得到了第一个问题,不是四个第二的四个答案。我看过了代码,看着异步执行,但似乎无法找到我的问题。

回答

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); 
} 

让我知道,如果事情是不明确。祝你好运!

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}) 
    } 
    }) 
    } 
    } 
)} 
+0

@codtex是对的,他们的代码更加高效:) –

+0

作为一名程序员,您自己找到了解决方案,这是一个非常好的信号。我只是想把你的想法指向另一个更高效的方法,我很高兴你明白它的工作原理:)干得好! – codtex