如何将线从线读取器推到数组?

时间:2019-01-30 09:35:43

标签: arrays node.js request fs

我被这个问题困扰。我试图将包含文本文件每行子字符串的对象推到fs linereader范围之外的数组。我几乎肯定我的数组在正确的范围内,但我的数组总是空着。

代码运行没有任何错误,我什至可以从文本文件中打印出每一行都没问题。

我正在尝试使用Node从文本日志文件中获取行,并将每行的各个部分推送到db。

var watcher = chokidar.watch("MyFolder", {ignored: /^\./, persistent: true});
watcher
  .on('add', function(path) {
    var myArray = [];
    console.log('File', path, 'has been added');
    var lineReader = require('readline').createInterface({
      input: require('fs').createReadStream(path)
    });
    lineReader.on('line', function (l) {
      l.toString();   
      myArray.push({
        "date" : l.substring(25,35),
        "time" : l.substring(35,46)
       });
    });
    console.log(myArray); //Always empty
  })
  .on('change', function(path) {console.log('File', path, 'has been changed');})
  .on('unlink', function(path) {console.log('File', path, 'has been removed');})
  .on('error', function(error) {console.log('Error happened', error);});

我希望控制台向我显示该数组,但是它始终为空。

1 个答案:

答案 0 :(得分:0)

获得空数组的原因是因为ReadLine将回调添加到IO event queue中,并且它将在当前执行脚本完成后执行。因此,看起来就像定义数组并将其打印在下一行。为了将数组中的所有值打印出来,您只需要在lineReader ReadLine object上为close事件添加一个侦听器。

下面是带有close事件的更新代码。

var watcher = chokidar.watch("MyFolder", {ignored: /^\./, persistent: true});
watcher
  .on('add', function(path) {
    var myArray = [];
    console.log('File', path, 'has been added');
    var lineReader = require('readline').createInterface({
      input: require('fs').createReadStream(path)
    });
    lineReader.on('line', function (l) {
      l.toString();   
      myArray.push({
        "date" : l.substring(25,35),
        "time" : l.substring(35,46)
       });
    });

    lineReader.on('close', function () {
      console.log(myArray);
    })

  })
  .on('change', function(path) {console.log('File', path, 'has been changed');})
  .on('unlink', function(path) {console.log('File', path, 'has been removed');})
  .on('error', function(error) {console.log('Error happened', error);});