我有一个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")
});
});
但他没有回答“完成”(在终端他写的,但邮递员只给我“无法得到任何回应”)
答案 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);