У меня есть функция, которая ожидает поток записи, которому я предоставляю следующий поток:
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.pipe() возвращает входной аргумент. Возвращаемое значение b.pipe(c)
- c
.
Когда вы вызываете fn(b.pipe(c))
, вы фактически fn(b.pipe(c))
поток преобразования b
и напрямую вводите поток записи c
.
b.pipe(c)
a.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)