createReadStream().pipe() コールバック 質問する

createReadStream().pipe() コールバック 質問する

あらかじめ申し訳ありませんが、createReadStream() に関していくつか質問があります。

基本的に私がやっていることは、ファイルを動的に構築し、完了したら fs を使用してユーザーにストリーミングすることです。 .pipe() を使用して、スロットリングが正しく行われていることを確認しています (バッファがいっぱいの場合は読み取りを停止し、いっぱいでなくなったら再度開始するなど)。 これまでのコードのサンプルを以下に示します。

http.createServer(function(req, res) {
  var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024})

  stream.pipe(res);

}).listen(3002, function() {
  console.log('Server listening on port 3002')
})

StackOverflow の別の質問 (失念してしまいました) で読んだのですが、通常の res.send() と res.end() を使用している場合、.pipe() は .send と .end を呼び出してスロットルを追加するので、非常にうまく機能するとのことです。

これはほとんどの場合に問題なく機能しますが、ストリームが完了したらファイルを削除したいのですが、.pipe() を使用しないと、コールバックを取得するためだけに自分でスロットリングを処理する必要があります。

そこで、res が通常行うことを実行する .send() および .end() メソッドを持つ独自の偽の "res" オブジェクトを作成し、.end() に生成されたファイルをクリーンアップするための追加コードを配置することになりそうです。私の質問は、基本的にそれをどのように実現するかということです。

これに関してご協力いただければ幸いです。ありがとうございます!

ベストアンサー1

ダウンロードに関する最初の部分は次のように答えることができます。NodeJS サーバーからファイルをダウンロードする

すべてのファイルを送信した後に削除する場合は、すべてのファイルを送信した後にファイルを削除する独自のイベント ハンドラーを追加するだけです。

var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024})
stream.pipe(res);

var had_error = false;
stream.on('error', function(err){
  had_error = true;
});
stream.on('close', function(){
  if (!had_error) fs.unlink('<filepath>/example.pdf');
});

ハンドラーerrorは 100% 必要ではありませんが、送信中にエラーが発生した場合はファイルを削除しません。

おすすめ記事