节点读取线(关闭)不会被击中

时间:2018-03-10 03:51:20

标签: node.js readline fs

我正在玩createReadStream并且有一个加载端点,我想基本上从文本文件中读取并返回json数据。我知道formatted数组看起来与我想要的完全一样,如果我在路线之外运行它,但我做了一些愚蠢的事情来打破这个。如果console.log中的on.('close'),我什么都没得到。这是我的路线:

const fs = require('fs');
const readline = require('readline').createInterface({
  input: fs.createReadStream(__dirname + '/users.txt')
});

router.route('/load')
  .get((req, res) => {
    let data = [];
    let itemised = [];
    let formatted = [];
    let tempObj = {
      "name": "",
      "phone": "",
      "email": "",
      "status": ""
    };
    readline.on('line', (line) => {
      data.push(line);
    });
    readline.on('close', () => {
      data.forEach((str) => {
        itemised.push(str.split(' '));
      })
      itemised.forEach((innerArr) => {
        const obj = innerArr.reduce(function(acc, cur, i) {
          let tempKeys = Object.keys(tempObj);
          acc[tempKeys[i]] = cur;
          return acc;
        }, {});
        formatted.push(obj);
      });
      res.json(formatted);
    });

  });

.txt文件如下所示:

John 1234567890 jdoe@gmail.com active
Mary 0987654321 mary@gmail.com inactive

1 个答案:

答案 0 :(得分:0)

注意:这是我的临时解决方法 - 非常感谢其他解决方案。

虽然我仍然对为什么我没有成功使用createReadStream感到沮丧,但我还是使用了以下解决方案。哪个好,对于小型数据文件,但如果我想处理图像或媒体文件,我更喜欢使用readline和pipe。无论如何,对于任何想要看到我不会投入生产的修复的人,请转到:

const fs = require('fs');
const readStream = fs.createReadStream(__dirname + '/users.txt');

router.route('/load')
  .get((req, res) => {
    let data = '';
    readStream.on('data', (chunk) => {
      data += chunk;
    }).on('end', () => {
        data = data.split("\n");
        let itemised = [];
        let formatted = [];
        let tempObj = {
          "name": "",
          "phone": "",
          "email": "",
          "status": ""
        };
        data.forEach((str) => {
          itemised.push(str.split(' '));
        })
        itemised.forEach((innerArr) => {
          const obj = innerArr.reduce((acc, cur, i) => {
            let tempKeys = Object.keys(tempObj);
            acc[tempKeys[i]] = cur;
            return acc;
          }, {});
          formatted.push(obj);
        });
        res.json(formatted);
    });
  });

仅供参考,我不会在媒体文件的生产级别中使用它,因为这会等待大量的块,因此我对readline和pipe感兴趣。