【问题标题】:Converting WriteStream to TransformStream将 WriteStream 转换为 TransformStream
【发布时间】:2017-07-11 04:14:31
【问题描述】:

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

通常,可写流位于管道链的末端,一旦收集到足够的数据用于输出,就会发出自定义事件。我希望它在中间,这样我就可以将它传送到另一个 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

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

【问题讨论】:

  • 也许应该在对象流的构造函数中添加事件处理程序,而不是在转换函数中。但是,没有办法使用through2 来创建构造函数,因此您必须直接使用节点的流 API 来执行此操作。你试过这个吗?
  • 谢谢!我使用 _transform 将其转换为流 API,现在警告消失了。所以将事件处理程序放在构造函数中效果非常好。

标签: node.js stream through2


【解决方案1】:

最好将事件处理程序放置在 Transform 流构造函数中。由于through2不支持这种初始化,需要直接使用node的stream API。

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

【讨论】:

    猜你喜欢
    • 2019-04-26
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2014-07-20
    • 2017-01-27
    • 2013-05-10
    相关资源
    最近更新 更多