[解決済み] Node.js 複数の(書き込み可能な)ターゲットに同じ読み込み可能なストリームをパイプする
2023-04-30 10:55:45
質問
私は、同じストリームからデータを読み取る必要がある 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
は、もちろん同じ問題をもたらします。
ファイルに書き込みたくないけど
再利用
というストリームを何らかの方法で再利用したいのです。
を要求する
が生成するストリーム(あるいはそれ以外のもの)に何らかの形で影響を与えます。
一度パイプ処理を終了した読み込み可能なストリームを再利用する方法はありますか? 上記の例のようなことを達成するための最良の方法は何でしょうか?
どのように解決するのですか?
2つのストリームにパイプで接続し、ストリームの複製を作成する必要があります。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
関連
-
[解決済み] ApacheとNode.jsを同じサーバーで使う
-
[解決済み] Node.jsのストリームの内容を文字列変数に読み込むにはどうしたらいいですか?
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] <Enter>でjQuery UIダイアログを送信する
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] Prototypeを使ってtextareaを自動サイズ調整するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptで次の要素/前の要素を取得しますか?
-
[解決済み] Javascriptによるタッチスクリーンデバイスの検出
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?