ノードの読み取り可能なストリームを使用して大きなファイル (~800 MB) を読み取ろうとしています。「読み取り可能」イベントをサブスクライブしました。データを取得すると、応答に書き込み、ドレインイベントがデータを再度読み取るのを待ちます。ただし、ドレイン イベントは 3 ~ 4 回しかトリガーされません。何か問題がある場合はお知らせください。
// Assume res to be any writable stream.
var readStream = fs.createReadStream('C:/movie.mp4');
readStream
.on('error', function (err) {
})
.on('readable', function () {
console.log('READABLE event fired');
writeStreamData(readStream, res);
})
.on('end', function () {
console.log('END event fired');
res.end();
});
function writeStreamData(readStream, res) {
var chunk, isFlushed;
console.log('in writeStreamData');
if (null !== (chunk = readStream.read(1024 * 1000))) {
console.log('writing data');
isFlushed = res.write(chunk);
if (!isFlushed) {
console.log('waiting for drain event');
res.once('drain', function () {
console.log('*** DRAIN event triggered');
writeStreamData(readStream, res);
});
} else {
writeStreamData(readStream, res);
}
}
}