Node.js转换文件stream并写入相同的文件结果为空文件

我正在尝试使用节点文件stream和自定义转换函数来修改一些文件。 这是转换function:

const TransformStream = function() { Transform.call(this, {objectMode: true}); }; util.inherits(TransformStream, Transform); TransformStream.prototype._transform = function(chunk, encoding, callback) { let line = chunk.toString() if (!this.findLinesMode && lineStartRe.test(line)) { this.findLinesMode = true this.lines = [] } if (this.findLinesMode) { this.lines.push(line) } if (this.findLinesMode && lineEndRe.test(line)) { this.findLinesMode = false line = this.lines.join('').replace(re, (str, match) => match.trim()) } if (!this.findLinesMode) { this.push(line + '\n') } callback() }; 

我试图在下面的代码中使用它:

 byline(fs.createReadStream(filePath, {encoding: 'utf8'})) .pipe(new TransformStream()) .pipe(fs.createWriteStream(filePath)) 

但是,文件结束为空。

我确信转换器的代码能够正常工作,因为我试图将其转换为process.stdout ,而输出正是我想要的。

我的问题是:我做错了什么,我可以尝试解决它?

这不是你的变压器代码的问题,而是一个问题,你打开一个文件写入,你甚至可能在你读取任何东西之前覆盖。

这在shell中是一样的。 如果你运行:

 cat < file.txt > file.txt 

要么:

 tr az AZ < x.txt > x.txt 

这将导致文件为空。

您必须pipe道到一个临时文件,然后用新的replace旧文件。 或者,也可以将旧的名称重命名为其他临时名称,使用正确的名称打开新文件,然后将重命名的文件传送到旧文件,然后进行转换。

确保使用安全的方式来创build临时文件的名称。 你可以使用如下模块: