两次管道相同的流会创建一个无限循环

时间:2016-02-13 16:24:26

标签: 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);

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

非常感谢。

1 个答案:

答案 0 :(得分:4)

它是同一个对象,因此需要无限循环:

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());