node.js将json数组对象插入mysql表

时间:2017-02-22 12:03:14

标签: javascript mysql node.js csv

我有一个csv,我想保存到我的mySQL表中。我的解析器运行良好,它还将创建的json数组保存到我的表中。我的问题是他在后台插入行而不响应它。

我的代码看起来像这样:

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非常大,有近500k行!

编辑:

我将async插入到我的解析器中:

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

    });

但他没有回答“完成”(在终端他写的,但邮递员只给我“无法得到任何回应”)

1 个答案:

答案 0 :(得分: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);