2014-05-16 26 views
5

我有一系列的变换流实现的CSV解析器变换流:如何谱写出的node.js

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

我想抽象语法分析器(它自己的模块),并能够做:

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

其中parser只是以前使用的转换流的组成。

如果我

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

然后parser被设置为buildObject()流和仅该变换流接收数据。

如果我做

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

它也不起作用,因为.pipe(process.stdout)将被称为1号变换流和2人将被绕过。

用于流的优雅组成的任何建议?

回答

7

不幸的是,没有内置的方式做到这一点,但有凉爽multipipe包。 使用这样的:

var multipipe = require('multipipe'); 

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

正是我需要的。谢谢。不敢相信这个模块不是更受欢迎... –

+0

一样。这太棒了。此外,multipipe的源代码非常短,因此值得查看实施情况,以便让任何看重引擎盖的人都了解。 – Owen

3

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

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