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

标签 javascript node.js stream pipe node.js-stream

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

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.

并将 inputStream 更改为 fs.createWriteStream 当然会产生相同的问题。 我不想写入文件,但以某种方式重用 request 产生的流(或任何其他方式)。

有没有办法在完成管道后重用可读流? 完成上述示例的最佳方法是什么?

最佳答案

您必须通过将其连接到两个流来创建流的副本。您可以使用 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

关于javascript - Node.js 将相同的可读流输送到多个(可写)目标中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19553837/

相关文章:

C 文件读取不正确

javascript - 当对象属性更改时使用 setter 来调度事件

javascript - Laravel - 在使用 jQuery AJAX 提交表单之前检查用户名是否已存在

c# - 开始了解 Web 套接字和 http 请求(和 STOMP)

c# - 尝试从NetworkStream读取导致程序崩溃,没有异常或错误

c# - StreamReader 返回 null

java - org.apache.commons.fileupload.FileUploadException : the request was rejected because no multipart boundary was found

javascript - jqplot 仅在一个图表上显示荧光笔

jquery - Cheerio 每个循环不会提前爆发

node.js - 如何获取在nodejs中运行脚本的文件的当前路径