如何在node.js中编写变换stream

我有一个csvparsing器实现为一系列的转换stream:

process.stdin .pipe(iconv.decodeStream('win1252')) .pipe(csv.parse()) .pipe(buildObject()) .pipe(process.stdout); 

我想抽象parsing器(在它自己的模块),并能够做到:

 process.stdin. .pipe(parser) .pipe(process.stdout); 

parser就是以前使用的变换stream的组合。

如果我做

 var parser = iconv.decodeStream('win1252') .pipe(csv.parse()) .pipe(buildObject()); 

然后parser被设置为buildObject()stream,只有这个转换stream接收数据。

如果我做

 var parser = iconv.decodeStream('win1252'); parser .pipe(csv.parse()) .pipe(buildObject()); 

它也不起作用,因为将在第一个变换stream上调用的是.pipe(process.stdout) ,另外两个将被绕过。

任何build议stream的优雅组成?

不幸的是,没有内置的方法来做到这一点,但有一个很酷的multipipe包。 像这样使用:

 var multipipe = require('multipipe'); var parser = multipipe(iconv.decodeStream('win1252'), csv.parse(), buildObject()); 

我一直在努力解决这个问题(和其他一些!)。 我发现highlandjs解决了我几乎所有的问题。 在这种情况下,他们的pipe道命令有诀窍:

 var h = require('highland'); var parser = h.pipeline(iconv.decodeStream('win1252'), csv.parse(), buildObject());