Преобразование 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 поток. Вот почему предупреждение появляется.

Другие вопросы по тегам