0

動的に作成されるファイルのダウンロードを提供するために使用されている fs ファイルストリームがあります。このストリームを取得し、適切なヘッダーを設定した後、応答オブジェクトにパイプします。

また、ストリーム イベントをいくつか設定して、エラーが発生した場合やストリームが終了した場合に、生成されたファイルをファイル システムから削除するようにしています。

ダウンロードが正しく初期化されていない、または終了していない場合に、ファイル システムにハング ファイルが残る場合があるという問題が発生しています。これは、ストリームにフックするイベントによるものだと思います。

私のコード:

stream = fs.createReadStream( fileName, {bufferSize: 64*1024})

had_error = false;
stream.on 'error', (err) ->
  had_error = err
stream.on 'close', ->
  if had_error
    console.log(had_error)

  fs.unlink fileName, (error) ->
    if error
      console.log("DELETE ERROR")
      console.log error

  fs.unlink dataFileName, (error) ->
    if error
      console.log("DELETE ERROR")
      console.log error

ストリーム APIドキュメントを確認すると、「close」イベントがすべてのストリームで呼び出されるわけではありません。ただし、ドキュメントによると、「終了」イベントを使用します。Indicates that no more 'data' events will happen. If the stream is also writable, it may be possible to continue writing.

「終了」イベントを使用した場合、これらのファイルを削除し、ストリームが http 応答への書き込みを完了していないと、ダウンロードが破損するという問題が発生するのではないかと心配しています。

これらのファイルを削除し、ダウンロードを中断しないためのキャッチとして使用できる「確実な」イベントはありますか?

最悪のシナリオでは、これらのファイルを削除するために cronjob を作成します (bleh)。

4

1 に答える 1

0

イベントが呼び出されることを確実にする確実な方法を見つけたことはありません。responseオブジェクトが実際にストリームを開始しない場合、開始されないため、終了イベントが発生しないと推測しています。誰かが回避策を知っている場合は、お気軽に回答して、無料で受け入れられた回答を入手してください。

于 2013-04-18T20:50:07.120 に答える