同じストリームからデータを読み取る必要がある 2 つのコマンドを連続して実行する必要があります。ストリームを別のストリームにパイプした後、バッファが空になるため、そのストリームからデータを再度読み取ることができないため、これは機能しません:
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
、もちろん同じ問題が発生します。私はファイルに書き込みたくありませんが、リクエストが生成するストリーム(またはその他のもの)を何らかの方法で再利用します。
パイプが終了したら、読み取り可能なストリームを再利用する方法はありますか? 上記の例のようなことを達成するための最良の方法は何でしょうか?