Node.js 内置模块 readline 关闭后继续读取行
Node.js builtin module readline keeps reading lines after being closed
我有以下代码:
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;
}
它似乎在工作,但在 line
事件触发时记录行显示并非如此。在调用 lineReader.close()
导致读取整个文件后,该事件仍在触发。我不知道是什么原因造成的。我发现了一些显然可以完成这项工作的模块,但我希望尽可能减少依赖性。
我建议不要处理和切换计数器,而是将行推送到数组并防止在数组大小为 4 后进一步推送。
然后调用 close 和 after 将数组解构为必要的属性和 return 包含它们的对象。
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(' '),
};
}
我有以下代码:
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;
}
它似乎在工作,但在 line
事件触发时记录行显示并非如此。在调用 lineReader.close()
导致读取整个文件后,该事件仍在触发。我不知道是什么原因造成的。我发现了一些显然可以完成这项工作的模块,但我希望尽可能减少依赖性。
我建议不要处理和切换计数器,而是将行推送到数组并防止在数组大小为 4 后进一步推送。
然后调用 close 和 after 将数组解构为必要的属性和 return 包含它们的对象。
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(' '),
};
}