Windows上的Node.js,管道多个脚本

时间:2013-06-15 04:35:14

标签: windows node.js unix stream piping

我在windows上使用node.js,我想创建单独的.js脚本,我可以单独处理可执行文件,并将stdout从一个可执行文件作为stdin传递到另一个可执行文件,类似于Unix。 / p>

技术上有一个“|” Windows中的运算符,但根据我的经验,它根本不能正常工作。我试图在node.js中实现自定义方法。语法可以是不同的,例如,

node combine "somescript 1" "someotherscript"

其中combine.js是处理“节点somescript 1”输出到“node someotherscript”输入的脚本。这是我到目前为止的尝试,但我可以使用一些帮助,我对node.js来说相当新,

 var child = require('child_process');

 var firstArgs = process.argv[2].split(' '); 

 var firstChild = child.spawn('node', firstArgs);

 var secondChild = child.spawn('node');

 firstChild.stdout.pipe(secondChild.stdin, { end: false });

 secondChild.stdout.pipe(process.stdout, { end: false }); 

 secondChild.on('exit', function (code) {
   process.exit(code);
 });

谢谢!

1 个答案:

答案 0 :(得分:1)

我要做的是为您的脚本使用Node.js Transform流,并根据命令行参数使用combine.jsrequirepipe这些流。

示例:

// stream1.js
var Transform = require('stream').Transform;

var stream1 = new Transform();
stream1._transform = function(chunk, encoding, done) {
  this.push(chunk.toString() + 's1\r\n');
  done();
};

module.exports = stream1;

// stream2.js
var Transform = require('stream').Transform;

var stream2 = new Transform();
stream2._transform = function(chunk, encoding, done) {
  this.push(chunk.toString() + 's2\r\n');
  done();
};

module.exports = stream2;

// combine.js

var stream1 = require('./' + process.argv[2]);
var stream2 = require('./' + process.argv[3]);

process.stdin.pipe(stream1).pipe(stream2).pipe(process.stdout);

那样跑:

> echo "hi" | node stream1 stream2

应输出:

hi
s1
s2