NodeJS等到mySQL查询插入多个值完成

时间:2018-04-16 16:50:15

标签: mysql node.js

我正在尝试在循环中插入数据,但它没有等到插入完成。 我的代码如下:

con.query('INSERT INTO pair_report_detail (studentID1, studentID2, result1, result2) 
VALUES  (\''+studentID[i]+'\', \''+studentID[j]+'\', 
'+result1.toFixed(2)+', '+result2.toFixed(2)+')', function(err, result) {
          if (err) throw err;

          var pair_report_detailID = result.insertId;
          var tokenMatchMarks = 0;
          var matchNo = 0;

          console.log(functions[i].length);
          console.log(functions[j].length);


          var sizeFile1 = functions[i].length;
          for(var z = 0; z < 20; z++)
          {
            if(z == tokenMatch1[tokenMatchMarks])
            {
              matchNo++;
              con.query('INSERT INTO functions (studentID, reportID , content, matchno) 
 VALUES  (\''+studentID[i]+'\', '+pair_report_detailID+', \''+functions[i][z]+'\', '+matchNo+')', function(err, result) {
                if (err) throw err;

                tokenMatchMarks++;
                console.log("Insert funtions");
              }); 
            }else
            {
              con.query('INSERT INTO functions (studentID, reportID , content) VALUES  (\''+studentID[i]+'\', '+pair_report_detailID+', \''+functions[i][z]+'\')', function(err, result) {
                if (err) throw err;
                console.log("Insert funtions");

              }); 
            }
          }
          });

我做错了什么?我知道NodeJS工作异步,不等待任何功能完成。但必须有一种方法可行。我做错了什么,或者我误解了什么?

先谢谢了! ;)

2 个答案:

答案 0 :(得分:0)

查看MySQL 2 Package

原因在于你的回答。 NodeJSasync,因此,它不会等待循环完成。

mysql2包中包含带有promises的mysql,因此它将极大地帮助您实现目标。特别是使用asyncawait

另外:使用let代替var for for循环

答案 1 :(得分:0)

还可以使用递归。

一些建议:

  • 在执行查询时使用?占位符,以避免sql注入
  • 使用事务处理:如果20个查询之一将下降,则db将有错误的数据。您可以通过事务begin; <insert pair_report_detail>; <20 times: insert functions>; commit;来避免它,并对任何错误执行rollback;

我不知道您到底需要什么,在下面的假设代码下:)

let query1 = 'insert into pair_report_detail (studentID1, studentID2, result1, result2) values (?, ?, ?, ?)';
let query2 = 'insert into functions (studentID, reportID , content, matchno) values (?, ?, ?, ?)';

con.query(query1, [studentID[i], studentID[j], result1.toFixed(2), result2.toFixed(2)], function (err, results) {
    if (err)
        throw err;

    let id = result.insertId;
    let tokenMatchMarks = 0;
    let matchNo = 0;  

    function insert (idx) {
        if (idx == 20)
            return console.log('DONE!');

        let isMatch = tokenMatch1[tokenMatchMarks]; 
        if (isMatch)
            tokenMatchMarks++;

        con.query(query2, [studentID[i], id, functions[i][idx], isMatch ? matchNo : null], function (err, res) {
            if (err)
                throw err;

            insert (idx + 1);   
        })  
    }

    insert (0);
});