web-dev-qa-db-ja.com

NodeJsのファイルの存在をチェックする最速の方法

私はノードに非常にシンプルなサーバーを構築しており、onRequestリスナーで、request.url

現在、私は最初にファイルを統計しようとしています(他の場所でmtimeを使用しているため)、それが失敗しない場合は、ディスクから内容を読み取ります。このようなもの:

fs.stat(request.url.pathname, function(err, stat) {
    if (!err) {
        fs.readFile(request.url.pathname, function( err, contents) {
            //serve file
        });
    }else {
        //either pull data from mongo or serve 404 error
    }
});

fs.statの結果をrequest.url.pathnameにキャッシュする以外に、このチェックを高速化できるものはありますか?たとえば、statの代わりにfs.readFileエラーが発生するかどうかを確認するのと同じくらい高速ですか?またはfs.createReadStreamの代わりにfs.readFileを使用していますか?または、child_process.spawnの何かを使用してファイルを潜在的にチェックできますか?基本的に、データを取得するためにリクエストをmongoに送信する必要がある場合、fileioをいじるのに余分な時間を費やさないようにしたいだけです...

ありがとう!

34
Lite Byte
var fs = require('fs');

fs.exists(file, function(exists) {
  if (exists) {
    // serve file
  } else {
    // mongodb
  }
});
58
fent

心配する必要はないと思いますが、キャッシュメカニズムをどのように改善できますか。 fs.statはファイルのチェックには本当に問題ありません。別の子プロセスでそれを行うと、おそらくここで助けてくれるよりも遅くなります。

このブログ投稿で説明されているように、Connectは数か月前にstaticCache()ミドルウェアを実装しました: http://tjholowaychuk.com/post/9682643240/connect-1-7-0-fast-static-file-memory -cache-and-more

Least-Recently-Used(LRU)キャッシュアルゴリズムは、Cacheオブジェクトを介して実装され、ヒットしたキャッシュオブジェクトを単に回転させます。これは、ますます人気のあるオブジェクトがその位置を維持する一方で、他のオブジェクトがスタックから押し出され、ガベージコレクションが行われることを意味します。

その他のリソース:
http://senchalabs.github.com/connect/middleware-staticCache.html
staticCacheのソースコード

2
alessioalex

このスニペットはあなたを助けることができます

fs = require('fs') ;
var path = 'sth' ;
fs.stat(path, function(err, stat) {
    if (err) {
        if ('ENOENT' == err.code) {
            //file did'nt exist so for example send 404 to client
        } else {
            //it is a server error so for example send 500 to client
        }
    } else {
        //every thing was ok so for example you can read it and send it to client
    }
} );
2
Salar

エクスプレスを使用してファイルを提供する場合は、sendFileエラーを使用することをお勧めします

const app = require("express")();

const options = {};
options.root = process.cwd();

var sendFiles = function(res, files) {
  res.sendFile(files.shift(), options, function(err) {
    if (err) {
      console.log(err);
      console.log(files);
      if(files.length === 0) {
        res.status(err.status).end();
      } else {
        sendFiles(res, files)
      }
    } else {
      console.log("Image Sent");
    }
  });
};

app.get("/getPictures", function(req, res, next) {
  const files = [
    "file-does-not-exist.jpg",
    "file-does-not-exist-also.jpg",
    "file-exists.jpg",
    "file-does-not-exist.jpg"
  ];

  sendFiles(res, files);

});

app.listen(8080);

ファイルが存在しない場合、自己送信エラーになります。ここでgithubリポジトリを作成しました https://github.com/dmastag/ex_fs/blob/master/index.js

0
julianalimin