2014-05-16 54 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());