• streams {Stream[]|Iterable[]|AsyncIterable[]|Function[]}
    • source {Stream|Iterable|AsyncIterable|Function}
      • Returns: {Iterable|AsyncIterable}
    • ...transforms {Stream|Function}
      • source {AsyncIterable}
      • Returns: {AsyncIterable}
    • destination {Stream|Function}
      • source {AsyncIterable}
      • Returns: {AsyncIterable|Promise}
    • callback {Function} 当管道完全地完成时调用。
      • err {Error}
      • val destination 返回的 Promise 的 resolve 的值。
    • 返回: {Stream}

    一个模块方法,使用管道传送多个流和生成器,并转发错误和正确地清理,当管道完成时提供回调。

    1. const { pipeline } = require('stream');
    2. const fs = require('fs');
    3. const zlib = require('zlib');
    4. // 使用 pipeline API 轻松地将一系列的流通过管道一起传送,并在管道完全地完成时获得通知。
    5. // 使用 pipeline 可以有效地压缩一个可能很大的 tar 文件:
    6. pipeline(
    7. fs.createReadStream('archive.tar'),
    8. zlib.createGzip(),
    9. fs.createWriteStream('archive.tar.gz'),
    10. (err) => {
    11. if (err) {
    12. console.error('管道传送失败', err);
    13. } else {
    14. console.log('管道传送成功');
    15. }
    16. }
    17. );

    pipeline API 也可以 promise 化:

    1. const pipeline = util.promisify(stream.pipeline);
    2. async function run() {
    3. await pipeline(
    4. fs.createReadStream('archive.tar'),
    5. zlib.createGzip(),
    6. fs.createWriteStream('archive.tar.gz')
    7. );
    8. console.log('管道传送成功');
    9. }
    10. run().catch(console.error);

    pipeline API 还支持异步的生成器:

    1. const pipeline = util.promisify(stream.pipeline);
    2. const fs = require('fs');
    3. async function run() {
    4. await pipeline(
    5. fs.createReadStream('lowercase.txt'),
    6. async function* (source) {
    7. source.setEncoding('utf8'); // Work with strings rather than `Buffer`s.
    8. for await (const chunk of source) {
    9. yield chunk.toUpperCase();
    10. }
    11. },
    12. fs.createWriteStream('uppercase.txt')
    13. );
    14. console.log('Pipeline 成功');
    15. }
    16. run().catch(console.error);

    stream.pipeline() 将会在所有的流上调用 stream.destroy(err),除了:

    • 已触发 'end''close'Readable 流。
    • 已触发 'finish''close'Writable 流。

    在调用 callback 之后,stream.pipeline() 会将悬挂的事件监听器留在流上。 在失败后重新使用流的情况下,这可能导致事件监听器泄漏和误吞的错误。