Преобразование WriteStream в 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
Так что мне немного любопытно, является ли это правильным способом преобразования писательских потоков?
1 ответ
Обработчик событий лучше всего разместить в конструкторе потока Transform. поскольку through2
не поддерживает такую инициализацию, вам нужно было бы напрямую использовать потоковый API-интерфейс узла.
В настоящее время новый обработчик событий (который никогда не удаляется - вот как .on()
работ) добавляется для каждого объекта, записанного в through2
поток. Вот почему предупреждение появляется.