当前位置: 首页 > 面试题库 >

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

唐利
2023-03-14
问题内容

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

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.

和改变 的inputStreamfs.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


 类似资料:
  • 问题内容: 目标是: 创建文件读取流。 用管道将其压缩到gzip() 然后将zlib输出的读取流通过管道传输到: 1)HTTP 对象 2) 和 可写文件流,以保存压缩后的输出。 现在我可以降到3.1了: …效果很好,但是我还需要 将压缩后的数据保存到文件中, 这样我就不需要每次都进行zip压缩,并且能够直接将压缩后的数据作为响应流化。 那么,如何在Node中一次将一个可读流传送到两个可写流中? 将

  • 我目前正在使用一个名为s3-upload-stream的Node.js插件,将非常大的文件传输到Amazon S3。它使用multipart API,并且在很大程度上工作得很好。 是否有一种方法可以使aws-sdk成为我可以将流管道传输到的东西?

  • 问题内容: 我一直在使用Node.js中的二进制流进行实验,但令我惊讶的是,确实有一个工作演示,它使用节点无线电流获取Shoutcast流,并使用分块编码将其推入HTML5元素。但这仅适用于Safari! 这是我的服务器代码: 我的客户代码很简单: 这在Mac上的Safari 5中可以正常运行,但在Chrome或Firefox中似乎无法执行任何操作。有任何想法吗? 可能的候选对象包括编码问题,或者

  • 问题内容: Gradle可以将多个项目合并到一个jar中吗? 我知道您可以使用以下方法针对单个项目执行此操作: 但是一个人如何将多个子项目压缩到一个jar中呢? 我试过了,但不起作用: 问题答案: 这是我的解决方案,它稍微简单一些: 代码已在Gradle 1.12上进行了测试

  • Kafka流中是否内置了允许将单个输入流动态连接到多个输出流的功能?允许基于true/false谓词进行分支,但这不是我想要的。我希望每个传入日志都确定它将在运行时流到的主题,例如,日志将流到主题和日志将流到主题。 我可以在流中调用,然后写给Kafka制作人,但这似乎不是很好。在Streams框架中是否有更好的方法来实现这一点?

  • 本文向大家介绍说说node中的可读流和可写流的区别,包括了说说node中的可读流和可写流的区别的使用技巧和注意事项,需要的朋友参考一下 前言 nodejs中大量的api与流有关,曾经看到公司的一些大神的node代码,实现一个接口只需要pipe一下另一个java接口就可以了。简单的一行代码实在让人困惑。作为小白的自己一脸懵逼却又不敢问,因为根本不知道从何问起。现在终于通过学习,也能对流说出个123,