将转换流应用于写入流而不控制读取流?

时间:2017-11-05 14:18:55

标签: javascript node.js stream

我有一个函数需要一个写入流,我提供以下流:

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

fn(logStream)

fn由第三方模块提供,因此我无法控制其实施。在内部,我知道fn最终会这样做:

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

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

  // ...
}

我的问题是,我知道读取流stream包含ANSI转义码,我不想将其输出到log.txt。在快速谷歌搜索之后,我找到了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))

如何在不控制提供读取流的管道链的开头的情况下将此转换流应用于写入流?

1 个答案:

答案 0 :(得分:1)

为了链接,stream.pipe()返回输入参数。 b.pipe(c)的返回值为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)