上传数据时暂停Node csv-parser

时间:2017-11-08 16:36:44

标签: node.js csv parsing

我正在使用Node csv-parser,我的读取流来自std in。我正在将它传递给解析器。在解析器可读函数内部,我正在进行异步HTTP调用以上传此数据。在此期间,我希望解析器暂停读取。直到异步调用完成了。



var parse = require('csv-parse');
  var output = [];
// Create the parser
  var parser = parse({delimiter: ',', columns: true, trim: true});
  
  parser.on('readable', function () {
    while (record = parser.read()) {
      console.log('Still reading');
      var jsonRec = convertIpToInt(record);
      var jsonData = JSON.stringify(jsonRec);
      output.push(new Buffer(jsonData + "\n"));
      //parser.pause();
      var assertPromise = uploadBatches1(indexName, function() {
          //parser.resume();
          console.log('Returned');
      });
     }
  });

  function uploadBatches1(indexToAssert, cb) {
    //uploads data got form parser
  }




1 个答案:

答案 0 :(得分:2)

由于csv-parse公开了一个可读的流,您可以使用parser.pause()暂停流

同样,更新完成后,您可以致电parser.resume()。您还可以使用parser.isPaused()检查是否需要事先恢复。

您可以阅读有关可读流的更多信息以及暂停方法在此处执行的操作: https://nodejs.org/api/stream.html#stream_readable_pause

基于以上所述,您应该实现parser.on('data')可读流事件,而不是while (record = parser.read())循环。如果您自己主动调用read方法,则暂停流无效。

考虑重构代码,然后使用文件系统中的parser.pipe读取:



var parse = require('csv-parse');
var output = [];
// Create the parser
var parser = parse({delimiter: ',', columns: true, trim: true});

parser.on('data', function () {
  console.log('Still reading');
  var jsonRec = convertIpToInt(record);
  var jsonData = JSON.stringify(jsonRec);
  output.push(new Buffer(jsonData + "\n"));
  parser.pause();
  var assertPromise = uploadBatches1(indexName, function() {
      parser.resume();
      console.log('Returned');
  });
});

function uploadBatches1(indexToAssert, cb) {
  //uploads data got form parser
}