Node.js将同一可读流传输到多个(可写)目标中

我需要连续运行两个命令,这些命令需要从同一流中读取数据。将流传输到另一个流之后,缓冲区将被清空,因此我无法再次从该流读取数据,因此无法正常工作:

var spawn = require('child_process').spawn;

var fs = require('fs');

var request = require('request');

var inputStream = request('http://placehold.it/640x360');

var identify = spawn('identify',['-']);

inputStream.pipe(identify.stdin);

var chunks = [];

identify.stdout.on('data',function(chunk) {

chunks.push(chunk);

});

identify.stdout.on('end',function() {

var size = getSize(Buffer.concat(chunks)); //width

var convert = spawn('convert',['-','-scale',size * 0.5,'png:-']);

inputStream.pipe(convert.stdin);

convert.stdout.pipe(fs.createWriteStream('half.png'));

});

function getSize(buffer){

return parseInt(buffer.toString().split(' ')[2].split('x')[0]);

}

对此抱怨

Error: You cannot pipe after data has been emitted from the response.

和改变 到fs.createWriteStream收益率,当然同样的问题。我不想写入文件,而是以某种方式 重用

产生的流(或与此相关的任何其他流)。

一旦可读流完成管道传输,是否可以重用?完成上述示例的最佳方法是什么?

回答:

您必须通过将其输送到两个流中来创建流的副本。您可以使用PassThrough流创建简单流,只需将输入传递到输出即可。

const spawn = require('child_process').spawn;

const PassThrough = require('stream').PassThrough;

const a = spawn('echo', ['hi user']);

const b = new PassThrough();

const c = new PassThrough();

a.stdout.pipe(b);

a.stdout.pipe(c);

let count = 0;

b.on('data', function (chunk) {

count += chunk.length;

});

b.on('end', function () {

console.log(count);

c.pipe(process.stdout);

});

输出:

8

hi user

以上是 Node.js将同一可读流传输到多个(可写)目标中 的全部内容, 来源链接: utcz.com/qa/412004.html

回到顶部