次のやや単純なミドルウェアを考えてみましょう:
(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
ソース ストリームはどのようにクリーンアップされますか? すべてのデータが読み取られた場合にのみ実行されますautoClose
。end
しかし、ターゲットが失敗した場合、それはどのようにソースに伝播されるのでしょうか?destroy
常にソース ストリームを呼び出す必要がありますか?