如何使用node.js中的event-stream将可读流管道传递给child_process.exec命令?

时间:2013-02-27 07:16:26

标签: node.js event-stream

我有以下(无效)代码:

var es = require('event-stream');
var cp = require('child_process');

es.pipeline(
    es.child(cp.exec("ls")),
    es.split(/[\t\s]+/),
    es.map(function(data,cb){
        if ( /\.txt$/.test(data) ) cb(null, data);
        else cb();
    }),
    es.child(cp.exec("cat "+data)) // this doesn't work
)

问题在于最后一个流es.child(cp.exec("cat "+data)),其中data是从map()流写入的块。如何实现这一目标?另请注意,“ls”和“cat”不是我正在使用的实际命令,但执行动态生成的unix命令和流输出的原理是相同的。

1 个答案:

答案 0 :(得分:0)

我不会使用event-stream,它基于较旧的流API。

对于错误的行,我会使用through2

var thr = require('through2').obj
var es = require('event-stream');
var cp = require('child_process');

function finalStream (cmd) {
  return thr(function(data, enc, next){
    var push = this.push

    // note I'm not handling any error from the child_process here
    cp.exec(cmd +' '+ data).stdout.pipe(thr(function(chunk, enc, next){
      push(chunk)
      next()
    }))
    .on('close', function(errorCode){
      if (errorCode) throw new Error('ops')
      next()
    })

  })
}

es.pipeline(
    es.child(cp.exec("ls")),
    es.split(/[\t\s]+/),
    es.map(function(data,cb){
        if ( /\.txt$/.test(data) ) cb(null, data);
        else cb();
    }),
    finalStream('cat') 
    thr(function(chunk, enc, next){
      // do stuff with the output of cat.
    }
)

我没有对此进行测试,但这就是我解决问题的方法。