首页 > 解决方案 > NodeJS:如何在从文件解析之前读取和修改缓冲区数据?

问题描述

在 NodeJS 中,我有一个日志文件,其中我的日志格式为:

{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}},
{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}},
{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}},

这些基本上是对象,用逗号分隔。我需要做的是读取此文件的内容并将日志转换为对象数组(我可以稍后操作)。

我正在尝试类似的东西:

    let fileLogs = "./data/myfile.log";
    fs.readFile(fileLogs, (err, fileLogsContent) => {
      if (err) {
        console.log("cannot read log file");
        return;
      }

      //I know I need to manipulate the fileLogsContent here, before doing JSON.parse

      let logsContent = { ...JSON.parse(fileLogsContent) };
      //do something here with the array of objects 'logsContent'
    });

由于日志文件中的内容不是可以解析的格式,所以上述JSON.parse失败。我的想法是将日志文件采用以下格式:

[
{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}},
{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}},
{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}}
]

这意味着我需要在运行[中添加第一个字符并将最后一个字符替换,]. 我不知道我该怎么做,因为fileLogsContent它实际上是一个缓冲区。那么我如何阅读内容并进行我提到的操作,以便以后能够对其进行解析并将其转化为array of objects格式?

标签: node.jsbufferreadfilestreamreadernode-streams

解决方案


您可以简单地将每一行包装在一个字符串中,然后JSON.parse在删除尾随逗号后调用它。这是一个示例(请注意,它仍然需要对 c 进行错误处理):

const fs = require('fs');
const readline = require('readline');
const readInterface = readline.createInterface({
    input: fs.createReadStream('./input.txt'),
    output: undefined,
    console: false
});

(async () => {
    const resultArray = await new Promise((resolve, reject) => {
        const chunks = [];
        readInterface.on('line', (line) => {
            line = line.substr(0, line.lastIndexOf(','))
            chunks.push(JSON.parse(`${line}`));
        })

        readInterface.on('close', () => {
            resolve(chunks);
        })
    });
    console.log(resultArray); 
})();

推荐阅读