Node.js内置模块readline在关闭后保持读取行

Node.js内置模块readline在关闭后保持读取行,node.js,readline,Node.js,Readline,我有以下代码: const fs = require("fs"); const {createInterface} = require("readline"); const {join} = require("path"); const {once} = require("events"); async function readMeta (path) { const meta = {}; const rs = fs.createReadStream(path); co

我有以下代码:

const fs = require("fs");
const {createInterface} = require("readline");
const {join} = require("path");
const {once} = require("events");

async function readMeta (path) {
    const meta = {};
    const rs = fs.createReadStream(path);
    const lineReader = createInterface({input: rs});

    let linesRead = 0;

    lineReader.on("line", line => {

        switch (linesRead) {
            case 0:
                meta.name = line;
                break;
            case 1:
                meta.tags = line.split(" ");
                break;
            case 2:
                meta.type = line;
                break;
            case 3:
                meta.id = +line;
        }

        if (++linesRead === 4) {
            lineReader.close();
        }
    });
    await once(lineReader, "close");
    rs.close();
    return meta;
}

它似乎正在工作,但在触发
事件时记录行会显示其他情况。调用
lineReader.close()
导致读取整个文件后,仍将触发该事件。我不知道是什么原因造成的。我发现一些模块显然可以完成这项工作,但如果可能的话,我希望能够降低依赖关系。

我建议将行推送到阵列,而不是处理和切换计数器,以防止在阵列大小为4后进一步推送

然后调用close和after将数组分解为必要的属性,并返回包含这些属性的对象

const fs = require("fs");
const {createInterface} = require("readline");
const {join} = require("path");
const {once} = require("events");

async function readMeta (path) {
    const meta = {};
    const rs = fs.createReadStream(path);
    const lineReader = createInterface({input: rs});

    const linesRead = [];

    lineReader.on("line", line => {
      if (linesRead.length === 4) {
        lineReader.close();
        rs.close();
        return;
      }
      linesRead.push(line.trim());
    });

    await once(lineReader, "close");
    delete rs;
    delete lineReader;

    const [name, tags, type, id] = linesRead;
    return {
      id,
      name,
      type,
      tags: tags.split(' '),
    };
}

最好
等待一次(lineReader,'end')文件可能不会很快关闭,但你的目标是在它结束阅读时捕获。我不确定我是否理解你的意思,我的目标是让它停止阅读,我不想阅读整个文件。调用
rs.close()如何紧跟在
lineReader.close()之后原因行读取器从未关闭的读取流中获取输入
rs
lineReader
触发它的
close
事件时正在关闭。请阅读“
调用rl.close()不会立即停止其他事件(包括“行”)由readline.Interface实例发出。
这意味着您必须首先关闭读取流