2

我正在将 a 的 stderr 流重定向detached child_process到一个文件,使用

fd = fs.openSync('./err.log', 'a');

并将这个 fd 作为标准错误传递给spawn.

我正在寻找一种方法来拦截写入文件的数据。意思是,当该子进程写入某些内容时,我想在写入文件之前对其进行处理。

我尝试制作一个可写流并将其而不是文件描述符提供给生成。但这没有帮助。

谁能建议我怎样才能做到这一点?

另外,我可以正常生成一个child_process(detached = false)并监听data事件,child.stdout当我准备好时,我可以分离孩子。所以基本上,我想要一些初始数据child_process,然后让它作为后台进程运行并终止父进程。

4

1 回答 1

1

你想要的是一个Transform 流

这是您的问题的可能解决方案:

var child = spawn( /* whatever options */ )
var errFile = fs.createWriteStream('err.log', { flags: 'w' })
var processErrors = new stream.Transform()
processErrors._transform = function (data, encoding, done) {
  // Do what you want with the data here.
  // data is most likely a Buffer object
  // When you're done, send the data to the output of the stream:
  this.push(data)
  done() // we're done processing this chunk of data
}
processErrors._flush = function(done) {
  // called at the end, when no more data will be provided
  done()
}

child.stderr.pipe(processErrors).pipe(f)

注意我们管道流的方式:stderr 是一个可读流,processErrors 是一个双工转换流,f 只是一个可写流。processErrors 流将处理数据并在收到数据时将其输出(因此看起来像一个PassThrough流,内部包含您的业务内部逻辑)。

于 2013-10-31T14:22:19.333 回答