私はノードに非常にシンプルなサーバーを構築しており、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をいじるのに余分な時間を費やさないようにしたいだけです...
ありがとう!
var fs = require('fs');
fs.exists(file, function(exists) {
if (exists) {
// serve file
} else {
// mongodb
}
});
心配する必要はないと思いますが、キャッシュメカニズムをどのように改善できますか。 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のソースコード
このスニペットはあなたを助けることができます
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
}
} );
エクスプレスを使用してファイルを提供する場合は、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