簡體   English   中英

執行MySQL查詢之前已發送NodeJS響應

[英]NodeJS response has been sent before MySQL query execution

這是我的NodeJS代碼,我想在執行查詢后返回csvFile數組,但是我首先返回一個空數組,然后執行查詢。 我在getSummary函數中調用getDetection函數。 這兩個函數都在執行查詢。 有人可以幫我嗎?

function getSummary(req, res) {
  var result = [];
  var csvFile = new Array();
  //console.log(csvFile);
  pool.getConnection(function(err, connection){
    if (err) {
          res.json({"code" : 100, "status" : "Error in connection database"});
          return;
        } 
    //var result = [];
    var option = req.body;
    //console.log(option.type);
    connection.query("SELECT DISTINCT name FROM dgh WHERE name LIKE ? ", ['%' + option.type.toUpperCase() + '%'], 
      function(err, rows, fields) {

        connection.release();
         if (err) {
          throw err;
        } else {
          for (var i = 0; i < rows.length; i++) {
           var row = rows[i].name;
           result.push(row);
           getDetection(result[i], function(result) {
            if (err) {
              throw err;
            } else {
            var count = result.count;
            var maxD = result.maxD;
            var array = new Array(count, maxD);
            csvFile.push(array); 
            //console.log(csvFile);
            }
           });
          }
        } 
    });  
  })

  console.log(csvFile);
  res.csv(csvFile);
}

getDetection函數:

function getDetection(filename, callback) {
    pool.getConnection(function(err, connection){
    if (err) {
          res.json({"code" : 100, "status" : "Error in connection database"});
          return;
        }   
    connection.query("SELECT hour, minute, second FROM dgh WHERE name = ?", [filename], 
      function(err, rows, fields){
        connection.release();
        if (err) {
          throw err;
        } else {
          var count = 0;
          var maxD = 0;
          for (var i = 1; i < rows.length; i++) {
            var time1 = rows[i].hour * 3600 + rows[i].minute * 60 + rows[i].second;
            var time2 = rows[i - 1].hour * 3600 + rows[i - 1].minute * 60 + rows[i].second;
            if (time2 - time1 > 60) {
              count = count + 1;
              maxD = Math.max(maxD, time2 - time1);
            }
          }
          callback({count:count, maxD:maxD});
        }

    })

  })
}

Node.js是異步的。 如果getDetection是一個異步函數,則for循環將無法按預期執行。

for (var i = 0; i < rows.length; i++) {
       var row = rows[i].name;
       result.push(row);
       getDetection(result[i], function(result) {
            if (err) {
               throw err;
            } else {
                var count = result.count;
                var maxD = result.maxD;
                var array = new Array(count, maxD);
                csvFile.push(array); 
                //console.log(csvFile);
            }
       })
    }
} 

截至目前,for循環將僅通過getDetection函數並完成迭代。 這將導致變量csvFile為空。

我建議您使用npm安裝異步軟件包。

npm install --save async

安裝后

async.each(rows, function(name, callback) {
    result.push(name)
    getDetection(name, function(item){
        if (err) throw err

        var count = item.count
        var maxD = item.maxD
        var array = new Array(count, maxD)
        csvFile.push(array)
        callback()
    })
}, function(err){
    if (err) {
        //Handle error here that occurred during iteration
    } else { //finished all iteration
        console.log(csvFile)
        res.csv(csvFile)
        return 
    }
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM