如何在无法修改writeToStream时为写入流添加Transform转换处理
问题根因
stream.pipe() 方法的返回值是下游的流对象,你代码里 upperCaseTr.pipe(r) 返回的是文件写入流 r,相当于你直接把目标写入流传给了 writeToStream,所有写入内容完全绕过了你定义的转换流,因此transform回调永远不会执行。
解决方法
Transform流同时实现了可写、可读接口,你只需要把转换流本身作为可写流传给writeToStream,提前建立转换流到目标文件流的管道即可:
const fs = require("fs"); const { Transform } = require("stream"); // 定义转换流 const upperCaseTr = new Transform({ transform(chunk, encoding, callback) { callback(null, chunk.toString().toUpperCase()); }, }); // 无法修改的第三方写入函数 function writeToStream(writeStream) { writeStream.write("test\n"); } const targetFileStream = fs.createWriteStream("test.txt"); // 先建立转换流到目标文件的管道 upperCaseTr.pipe(targetFileStream); // 把转换流传给写入函数,所有写入内容都会先经过转换处理 writeToStream(upperCaseTr); // 写入完成后手动结束转换流,确保所有缓冲内容都被刷入目标文件 upperCaseTr.end();
运行后test.txt中会输出大写的TEST,符合预期。
内容的提问来源于stack exchange,提问作者Colin D
相关产品推荐
相关产品推荐

