2017-02-22 26 views
0

У меня есть csv, который я хочу сохранить в моей таблице mySQL. Мой анализатор работает хорошо, и он также сохраняет созданный json Array на моем столе. Моя проблема в том, что он вставляет строку для строки в фоновом режиме и не отвечает на нее.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') 
     }) 

Моя цель состоит в том, что мой апи отправить: его "сделано" с (res.json ("Done")), когда полный запрос делается. Что я должен изменить?

Привет

редактировать: мой CSV является действительно большой, с почти 500к строк!

EDIT:

Я вставил асинхр в мой парсер так:

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

    }); 

Но он не с Отвечает «Done» (в терминале он написал, но почтальон дать мне только «Могли не получаю ответа ")

+0

Мой новый код с асинхронным делать не Рез. Я только получаю res в моей консоли (см. Edit2) – Ckappo

ответ

1

Ваш звонок по номеру res.end()/res.json() не дождался завершения всех вставок.

И если вы начинаете свои вставки внутри цикла, вы начинаете их все более или менее параллельно. Вы должны взглянуть на что-то вроде библиотеки async (http://caolan.github.io/async). Там вы найдете функцию eachLimit(), которая позволяет запускать операции async в коллекции/массиве. С помощью этой функции вы можете ограничить количество операций, выполняемых параллельно. И вы получаете обратный вызов, который вызывается при возникновении ошибки или завершении всех асинхронных вызовов. В этом обратном вызове вы можете вызвать функцию 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^