【问题标题】:Apply transform stream to write stream without controlling read stream?将转换流应用于写入流而不控制读取流?
【发布时间】:2017-11-07 10:23:23
【问题描述】:

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

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

fn(logStream)

fn是第三方模块提供的,所以我不控制它的实现。在内部,我知道fn 最终会这样做:

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

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

  // ...
}

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

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

【问题讨论】:

    标签: javascript node.js stream


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多