0

Express.js モジュールにパイプラインがあり、ファイルを取得して復号化し、ダイジェストに渡して有効であることを確認し、ダイジェストが合格した場合は応答として返したいと考えています。コードは次のようになります。

function GetFile(req,res) {
    ...
    }).then(() => {
        var p1 = new Promise(function(resolve,reject) {
            digester = digestStream("md5", "hex", function(md5,len) {
                // compare md5 and length against expected values
                // what do i do if they don't match?
                resolve()
            }
        }
        infile.pipe(decrypter).pipe(digester).pipe(res)
        return p1
    }).then(() => {
    ...
}

問題は、出力をresにパイプすると、ダイジェストが通過するかどうかに関係なくパイプすることです。しかし、ダイジェスターの出力を何にもパイプしないと、何も起こりません。データを移動する右端からの圧力はないと思います。

単純に復号化パイプラインを 2 回実行することもできます。実際、これは以前に行われたことですが、すべてを 1 回だけ実行するように速度を上げようとしています。私が持っていた 1 つのアイデアは、ダイジェスト出力をバッファーにパイプし、ダイジェストが一致した場合はバッファーを に送信することでしたres。これには、ファイルのサイズに比例したメモリが必要になりますが、ほとんどの場合、これは恐ろしいことではありません。.pipe()ただし、バッファに直接アクセスする方法についてはあまり見つけられませんでした。私が見つけた最も近いものはblモジュールでしたが、データを収集する関数へのパイプを示しているセクションでは、次の警告が言及されています。

このようにコールバック メソッドを使用すると、結果のデータ パラメータはリスト内のすべての Buffer オブジェクトを連結したものになることに注意してください。この連結のオーバーヘッドを回避したい場合 (極端なパフォーマンス意識の場合)、コールバック メソッドを避け、代わりに標準の Stream のように 'end' をリッスンします。

blこれがどれほど効率的であるかに関して、これが実際に何を意味するのかを理解するのに十分なほど精通していません。具体的には、バッファオブジェクトの連結について話している理由がわかりません-たとえば、連結する必要があるバッファオブジェクトが複数あるのはなぜですか?)。どうすればそのアドバイスに従い、単純なパイプを使用できるかわかりません。

4

1 に答える 1