Применить преобразование потока для записи потока без управления потоком чтения?

1

У меня есть функция, которая ожидает поток записи, которому я предоставляю следующий поток:

const logStream = fs.createWriteStream('./log.txt')

fn(logStream)

fn предоставляется сторонним модулем, поэтому я не контролирую его реализацию. Внутри я знаю, что fn конце концов это делает:

// super simplified
fn (logStream) {
  // ...

  stream.pipe(logStream, { end: true })

  // ...
}

Моя проблема в том, что я знаю, что поток stream чтения содержит escape-коды ANSI, которые я не хочу выводить на свой log.txt. После быстрого поиска в Google я нашел chalk/strip-ansi-stream, который представляет собой поток преобразования, предназначенный для этого.

Итак, будучи новичком потоков Node, который я есть, я решил попробовать изменить код:

const stripAnsiStream = require('strip-ansi-stream')

const logStream = fs.createWriteStream('./log.txt')

fn(stripAnsiStream().pipe(logStream))

... который не работает: файл моего файла по-прежнему содержит контент с кодами выхода ANSI. Я думаю, это потому, что вместо создания такой цепи, как

a.pipe(b).pipe(c)

Я действительно сделал

a.pipe(b.pipe(c))

Как я могу применить этот поток преобразования к потоку записи без управления началом цепочки каналов, где предоставляется поток чтения?

Теги:
stream

1 ответ

1
Лучший ответ

Для цепочки, stream.pipe() возвращает входной аргумент. Возвращаемое значение b.pipe(c) - c.

Когда вы вызываете fn(b.pipe(c)), вы фактически fn(b.pipe(c)) поток преобразования b и напрямую вводите поток записи c.

Случай №1: a.pipe(b.pipe(c))

b.pipe(c)
a.pipe(c)

Случай № 2: a.pipe(b).pipe(c)

a.pipe(b)
b.pipe(c)

Поток преобразования может быть передан в поток журнала, а затем передан в модуль отдельно. Вы эффективно используете случай №2, но начинаете трубы в обратном порядке.

const stripAnsiStream = require('strip-ansi-stream')
const fn = require('my-third-party-module')

const transformStream = stripAnsiStream()
const logStream = fs.createWriteStream('./log.txt')

transformStream.pipe(logStream)
fn(transformStream)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню