我有一个csv解析器实现为一系列转换流:
process.stdin
.pipe(iconv.decodeStream('win1252'))
.pipe(csv.parse())
.pipe(buildObject())
.pipe(process.stdout);
Run Code Online (Sandbox Code Playgroud)
我想抽象解析器(在它自己的模块中)并且能够:
process.stdin.
.pipe(parser)
.pipe(process.stdout);
Run Code Online (Sandbox Code Playgroud)
其中parser只是先前使用的变换流的组成.
如果我做
var parser = iconv.decodeStream('win1252')
.pipe(csv.parse())
.pipe(buildObject());
Run Code Online (Sandbox Code Playgroud)
然后parser设置为buildObject()流,只有此转换流接收数据.
如果我做
var parser = iconv.decodeStream('win1252');
parser
.pipe(csv.parse())
.pipe(buildObject());
Run Code Online (Sandbox Code Playgroud)
它也不起作用,因为.pipe(process.stdout)将在第一个变换流上调用,另外两个将被绕过.
对优雅的溪流组合的任何建议?
vku*_*kin 12
不幸的是,没有内置的方法可以做到这一点,但有很酷的multipipe包.使用这样:
var multipipe = require('multipipe');
var parser = multipipe(iconv.decodeStream('win1252'), csv.parse(), buildObject());
Run Code Online (Sandbox Code Playgroud)
截至 2022 年,nodejs v16 中,composestream 模块中有一个新函数,可以从流列表构建 Duplex 流。
请参阅: https: //nodejs.org/api/stream.html#streamcomposestreams
使用.pipe()和 异步语法。