node.jsのfs.createReadStreamとfs.readFileの長所と短所は何ですか?
質問
私はnode.jsをいじくりまわしており、いったんファイルが存在することを確認し、writeHeadで適切なMIMEタイプを送信した後、ファイルを読み込んでワイヤーで送信する2つの方法を発見しました。
// read the entire file into memory and then spit it out
fs.readFile(filename, function(err, data){
if (err) throw err;
response.write(data, 'utf8');
response.end();
});
// read and pass the file as a stream of chunks
fs.createReadStream(filename, {
'flags': 'r',
'encoding': 'binary',
'mode': 0666,
'bufferSize': 4 * 1024
}).addListener( "data", function(chunk) {
response.write(chunk, 'binary');
}).addListener( "close",function() {
response.end();
});
問題のファイルがビデオのような大きなものである場合、fs.createReadStreamはより良いユーザー体験を提供するかもしれないと仮定するのは正しいですか?それはブロック的でないかもしれないように感じますが、これは本当でしょうか? 私が知る必要のある他の長所、短所、注意点、または gotchas がありますか?
どのように解決するのですか?
より良い方法として、"write()"に"data"を、"end()"に"close"を引っ掛けるだけなら、以下の方法があります。
// 0.3.x style
fs.createReadStream(filename, {
'bufferSize': 4 * 1024
}).pipe(response)
// 0.2.x style
sys.pump(fs.createReadStream(filename, {
'bufferSize': 4 * 1024
}), response)
は
read.pipe(write)
または
sys.pump(read, write)
アプローチには、フロー制御を追加する利点もあります。 つまり、書き込みストリームがそれほど速くデータを受け入れることができない場合、読み込みストリームに後退するように指示し、メモリにバッファリングされるデータ量を最小限に抑えます。
また
flags:"r"
と
mode:0666
であることは暗黙の了解です。
FileReadStream
. は
binary
エンコーディングは非推奨です。エンコーディングが指定されない場合は、生のデータバッファで動作します。
また、ファイルサービスをよりスムーズにするために、他のグッズを追加することができます。
-
をスニッフィングします。
req.headers.range
のような文字列にマッチするかどうかを確認し/bytes=([0-9]+)-([0-9]+)/
. もしそうなら、その開始位置から終了位置までストリーミングしたいだけなのです。 (欠番は 0 または "終わり" を意味します。) -
stat()呼び出しからinodeと作成時間をETagヘッダーにハッシュ化します。 そのヘッダにマッチする "if-none-match" を持つリクエストヘッダを取得した場合、そのヘッダを返します。
304 Not Modified
. -
を確認します。
if-modified-since
ヘッダをmtime
ヘッダを返します。 提供された日付以降に変更されていない場合は、304。
また、一般的に、可能であれば、送信時に
Content-Length
ヘッダを送信してください。 (あなたは
stat
-を付けているので、これがあるはずです)
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] package.jsonのチルダ(~)とキャレット(^)の違いは何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] npm installの-saveオプションは何ですか?
-
[解決済み] Node.jsを完全にアンインストールして、最初から再インストールする方法 (Mac OS X)
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み】JavaScript版sleep()とは?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptで次の要素/前の要素を取得しますか?
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]
-
[解決済み] JavaScriptデータフォーマット/プリティプリンタ