node.js - 通过管道传输同一流两次会产生无限循环

标签 node.js node.js-stream

我正在练习 Node.js 流,但在使用以下代码时遇到问题:

'use strict'

let stream = require('stream');

let logger = new stream.Transform({
  transform: function (chunk, encoding, next) {
    console.log(`Chunk: ${chunk}`);
    this.push(chunk);
    next();
  }
})

let liner = new stream.Transform({
  transform: function (chunk, encoding, next) {
    chunk.toString().split('\r\n').forEach(e=>this.push(e));
    next();
  }
})

process.stdin.pipe(logger).pipe(liner).pipe(logger);

我预计对记录器的两次调用是记录器流的不同实例,但它们似乎是相同的,并且它们进入无限循环,所以我应该如何调用它们以便此代码按预期工作。

非常感谢。

最佳答案

这是同一个对象,因此预计会出现无限循环:

process.stdin.pipe(logger).pipe(liner).pipe(logger);
//                    ^-----------------------|

尝试使用 2 个不同的实例:

'use strict'

let stream = require('stream');


let logger = function () {
    return new stream.Transform({
        transform: function (chunk, encoding, next) {
            console.log(`Chunk: ${chunk}`);
            this.push(chunk);
            next();
        }
    });
}

let liner = new stream.Transform({
    transform: function (chunk, encoding, next) {
        chunk.toString().split('\r\n').forEach(e=> this.push(e));
        next();
    }
})

process.stdin.pipe(logger()).pipe(liner).pipe(logger());

关于node.js - 通过管道传输同一流两次会产生无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35382286/

相关文章:

javascript - axios 超时重试

javascript - 逗号分隔符多维数组

javascript - 无法更新 Angular 版本

node.js - 使用 init.d 重启 Node.js 应用程序

node.js - 将可写 Node 流合并为一个流

javascript - Node.js 将相同的可读流输送到多个(可写)目标中

javascript - 随时随地将文本附加到 Node.js 流

javascript - 将 AngularJS 添加到现有的 node-express-mysql 应用程序

node.js - 从管道 HTTP 流中删除 header

javascript - 使用流写入和读取文件