将 WriteStream 转换为 TransformStream

Converting WriteStream to TransformStream

我有一个(有点奇怪的)可写流,我需要将其转换为转换流。

可写流通常位于管道链的末尾,并在收集到足够的数据用于输出后发出自定义事件。我想让它放在中间,这样我就可以将它传送到另一个 writeStream,即:

    readStream.pipe(writeStreamToConvert).pipe(finalWriteStream);

我所做的如下,并且有效。

    const through2 = require('through2')


    var writeStreamToConvert = new WriteStreamToConvert();

    return through2.obj(function (chunk, enc, callback) {

        writeStreamToConvert.write(chunk)

        // object is the event emitted from the writestream
        writeStreamToConvert.on('object', (name, obj ) => {
            this.push(JSON.stringify(obj, null, 4) + '\n')
        });            

        callback()
    })

这工作正常,似乎没有泄漏内存,而且速度相当快。但是节点给我一个警告:

Warning: Possible EventEmitter memory leak detected. 11 object listeners added. Use emitter.setMaxListeners() to increase limit

所以我有点好奇这是否是转换 writestream 的正确方法?

事件处理程序最好放在转换流构造函数中。由于 through2 不支持这样的初始化,您需要直接使用节点的流 API。

目前,正在为每个写入 through2 流的对象添加一个新的事件处理程序(永远不会删除 -- 这就是 .on() 的工作方式)。这就是出现警告的原因。