我有一个通过一系列转换流实现的csv解析器:
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)
将在第一个转换流上调用,而其他两个将被绕过。
对流的优雅组合有何建议?
[遗憾的是,没有内置方法可以执行此操作,但是有很酷的multipipe程序包。像这样使用:
var multipipe = require('multipipe');
var parser = multipipe(iconv.decodeStream('win1252'), csv.parse(), buildObject());
我一直在努力解决这个问题(以及其他一些问题!)。我发现highlandjs几乎解决了我所有的问题。在这种情况下,他们的pipeline命令起到了作用:
var h = require('highland');
var parser = h.pipeline(iconv.decodeStream('win1252'), csv.parse(), buildObject());
此功能已添加到v10.0.0的节点中
现在您可以:
const stream = require('stream');
stream.pipeline(...streams, completed_callback);
docs:https://nodejs.org/api/stream.html#stream_stream_pipeline_streams_callback