如何在node.js中组合变换流

Lau*_* VB 12 stream node.js

我有一个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)


Elm*_*tou 5

截至 2022 年,nodejs v16 中,composestream 模块中有一个新函数,可以从流列表构建 Duplex 流。

请参阅: https: //nodejs.org/api/stream.html#streamcomposestreams

使用.pipe()和 异步语法。