【发布时间】: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,现在警告消失了。所以将事件处理程序放在构造函数中效果非常好。