如何在node.js中构成转换流

问题描述 投票:12回答:3

我有一个通过一系列转换流实现的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)将在第一个转换流上调用,而其他两个将被绕过。

对流的优雅组合有何建议?

node.js stream
3个回答
12
投票

[遗憾的是,没有内置方法可以执行此操作,但是有很酷的multipipe程序包。像这样使用:

var multipipe = require('multipipe');

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

4
投票

我一直在努力解决这个问题(以及其他一些问题!)。我发现highlandjs几乎解决了我所有的问题。在这种情况下,他们的pipeline命令起到了作用:

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

0
投票

此功能已添加到v10.0.0的节点中

现在您可以:

const stream = require('stream');
stream.pipeline(...streams, completed_callback);

docs:https://nodejs.org/api/stream.html#stream_stream_pipeline_streams_callback

© www.soinside.com 2019 - 2024. All rights reserved.