1

私のプロジェクトでは、クライアントは ID を使用してサーバーからファイルをダウンロードするように要求します。次の操作を実行する必要があります。

  • mongoDb からの ID を検証します
  • 拡張子を確認
  • ファイルが存在するかどうかを確認します
  • ファイルを読み取り、コンテンツを応答に書き込みます

ファイルをチェックして応答を送信するために、次のコードを使用しています。

fs.exists(filename, function(exists) {
  if (!exists) {
    res.writeHead(404, '', {
      "Content-Type" : "text/plain"
    })
    res.write("404 Not Found\n");
    res.end();
    return;
  }
  fs.readFile(filename, "binary", function(err, file) {
    if (err) {
      res.writeHead(500, '', {
        "Content-Type" : "text/plain"
      })
      res.write(err + "\n");
      res.end();
      return;
    }
    res.setHeader("Pragma", "public");
    res.setHeader("Cache-Control: private, max-age=3600");
    res.setHeader("Transfer-Encoding:  chunked");
    res.setHeader("Range:  chunked");
    res.writeHead(200, '', {
      "Content-Type" : contentType
    });
    res.write(file, "binary");
    res.end(file, "binary");
  });
});

数ミリ秒以内に、クライアントは数百のファイルを要求します。サポートされているファイルの種類は、画像、オーディオ、またはビデオです。

フォルダー内に多数のファイルがある場合、node.js はファイルのダウンロードに時間がかかりすぎます。どうすればパフォーマンスを向上させることができますか?

4

1 に答える 1

6

いくつかお勧めします。

  1. を使用しないでください'binary'。エンコーディングをまったく指定しないでください。エンコーディングを追加することにより、ファイルのBufferオブジェクトをバイナリでエンコードされstringた . writeもう一度呼び出すと'binary'、ノードは同じ操作を逆に実行する必要があります。また、ファイルを と の両方に渡しますendwriteつまり、ダウンロードするすべてのファイルにファイル データが 2 回含まれることになります。

  2. を使用しないことをお勧めしreadFileます。readFileファイルの内容全体を変数で返すため、ノードfileがファイルの内容全体を RAM にロードする必要があります。つまり、大量のバッファーを割り当ててからそれらを連結する必要がありますが、これは不要な作業です。

  3. exists存在しないファイルを開こうとするとエラーが表示されるため、個別に使用する理由はありません。

また、Transfer-encodingヘッダーはすべてそれ自体で設定されるため、それを行う必要はありません。

このようなものはより速くなるはずです:

fs.createReadStream(filename)
    .on('error', function(err){
        if (err.code === 'ENOENT'){
            res.writeHead(404, {
                'Content-type': 'text/plain'
            });
            res.end('404 Not Found\n');
        } else {
            res.writeHead(500, {
                'Content-type': 'text/plain'
            });
            res.end(err + '\n');
        }
    })
    .on('open', function(){
        res.writeHead(200, {
            'Pragma': 'public',
            'Cache-Control': 'private, max-age=3600',
            'Content-type': contentType
        });
    })
    .pipe(res);
于 2012-12-29T15:52:47.797 に答える