2017-02-22 70 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);