我有以下(无效)代码:
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命令和流输出的原理是相同的。
答案 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.
}
)
我没有对此进行测试,但这就是我解决问题的方法。