如何在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());