0

次のやや単純なミドルウェアを考えてみましょう:

(req, res, next) => {
  const stream = fs.createReadStream(req.filePath)

  await new Promise((resolve, reject) => stream    
    .on('error', reject)
    .on('end', resolve)
    .pipe(res, { end: false })
    .on('error', reject)
    // 'close' is emitted if client prematurely disconnects.
    .on('close', resolve)
  res.end()
}

対処方法がわからない問題がいくつかあります。

  • このミドルウェアが実行される前に res が既に 'close' を出力している場合、スタックします。
  • res が発行された場合、closeまたはerrorソース ストリームはどのようにクリーンアップされますか? すべてのデータが読み取られた場合にのみ実行されますautoCloseendしかし、ターゲットが失敗した場合、それはどのようにソースに伝播されるのでしょうか? destroy常にソース ストリームを呼び出す必要がありますか?
4

1 に答える 1

0

これはトリックを行うようです:

import onFinished from 'on-finished'

(req, res, next) => {
  const stream = fs.createReadStream(req.filePath)

  onFinished(res, () => stream.destroy && stream.destroy())

  if (onFinished.isFinished(res)) {
    return
  }

  await new Promise((resolve, reject) => stream    
    .on('error', reject)
    .on('end', resolve)
    .pipe(res, { end: false })
    .on('error', reject)
    // 'close' is emitted if client prematurely disconnects.
    .on('close', resolve)
  res.end()
}
于 2016-07-03T17:37:02.343 に答える