Node.js Piping the same readable stream into multiple (writable) targets(Node.js 将相同的可读流输送到多个(可写)目标中)
问题描述
我需要连续运行两个需要从同一流中读取数据的命令.在将一个流传输到另一个流后,缓冲区被清空,因此我无法再次从该流中读取数据,因此这不起作用:
I need to run two commands in series that need to read data from the same stream. After piping a stream into another the buffer is emptied so i can't read data from that stream again so this doesn't work:
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 产生的流(或任何其他方式).
and changing the inputStream to fs.createWriteStream
yields the same issue of course.
I don't want to write into a file but reuse in some way the stream that request produces (or any other for that matter).
有没有办法在完成管道后重用可读流?完成上述示例的最佳方法是什么?
Is there a way to reuse a readable stream once it finishes piping? What would be the best way to accomplish something like the above example?
推荐答案
您必须通过管道将其连接到两个流来创建流的副本.您可以使用 PassThrough 流创建一个简单的流,它只是将输入传递到输出.
You have to create duplicate of the stream by piping it to two streams. You can create a simple stream with a PassThrough stream, it simply passes the input to the output.
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 将相同的可读流输送到多个(可写)目标中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Node.js 将相同的可读流输送到多个(可写)目标中
基础教程推荐
- 动态更新多个选择框 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01