2017-02-22 67 views
0

我有一個csv,我想保存到mySQL表中。我的解析器運行良好,它也將創建的json數組保存到我的表中。我的問題是,他在後臺插入行的行,不要回應。node.js插入json數組對象到mysql表中

我的代碼看起來像這樣:

var file= './mytable.csv'; 
    connection.connect(function (err) {}); 
var csv = require('csvtojson'); 

    csv({ delimiter:","}) 
     .fromFile(file) 
     .on('end_parsed', function(jsonArray){ 
      for(var i = 0; i < jsonArray.length; i++){ 
       var post = jsonArray[i] 
       conn.query('INSERT INTO mytable SET ?', post, function(err, results) { 
        if (err) throw err; 
        console.log(result.insertId); 
       }); 
      } 
      res.end("done"); 
     }) 
     .on('done', function(error){ 
      console.log('end') 
     }) 

我的目標是我的API發送:其「做」與(res.json(「完成」))當完成查詢完成。我應該改變什麼?

問候

編輯:我的CSV是真的大,幾乎50萬行!

編輯:

我插入異步到我的解析器這樣的:

csv({ delimiter:";"}) 
    .fromFile(file) 
    .on('end_parsed', function(jsonArray) { 
     async.forEach(jsonArray, function (jsonArrays, callback) { 
      conn.query('INSERT INTO mytable SET ?', jsonArrays, callback); 
     }, function (err) { 
      if (err) return next(err); 
      res.json("done"); 
      console.log("done") 
     }); 

    }); 

但他不「完成」(在終端,他寫的,但郵遞員給我的只有「莫非responde沒有得到任何迴應「)

+0

我與異步新的代碼沒有資源。我只能在我的控制檯中獲取資源(請參閱edit2) – Ckappo

回答

1

您致電res.end()/res.json()不等待所有插入完成。

如果你在一個for循環中開始你的插入,你可以或多或少並行地啓動它們。你應該看看類似async庫(http://caolan.github.io/async)。在那裏您會找到一個eachLimit()函數,可以讓您在集合/數組上運行異步操作。使用此功能,您可以限制並行運行多少操作。而且你會得到一個回調,當發生錯誤或所有的異步調用完成時調用。在此回調中,您可以撥打res.json(...)函數發送回覆。

樣品:

var async = require('async'); 

//... 

function save_row_to_db (post, callback) { 
    conn.query('INSERT INTO mytable SET ?', post, callback); 
} 

function finished(err) { 
    if (err) throw err; 
    res.end("done"); 
} 

async.eachLimit(csvRows, 20, save_row_to_db, finished);