Skip to content

Instantly share code, notes, and snippets.

@tak1827
Created July 18, 2015 00:51
Show Gist options
  • Save tak1827/f0fc9abc761ce59195c6 to your computer and use it in GitHub Desktop.
Save tak1827/f0fc9abc761ce59195c6 to your computer and use it in GitHub Desktop.
キャッシュ機能ありの簡易Httpサーバー
// 必要なモジュールの読み込み
var http = require('http');
var fs = require('fs');
var path = require('path');
// Webアプリのpath
var webappPath = '/Users/re795h/Documents/nodeworkspace';
// MIMEタイプ
var mimeTypes = {
'.html': 'text/html',
'.css': 'text/css',
'.js': 'text/javascript',
'.jpg': 'image/jpeg',
'.png': 'image/png'
};
// キャッシュオブジェクト
var cache = {
store: {},// データを格納
maxsize: 26214400, // 最大格納サイズ ->25MB
maxAge: 5400 * 1000, // 最長格納時間 ->1.5時間
clean: function(now) {
var self = this;
Object.keys(self.store).forEach(function(file) {
if (now > self.store[file].timestamp + self.maxAge) {
delete self.store[file];
}
});
}
};
// キャッシュを貯める
function cacheFile(f, callback) {
fs.stat(f, function(err, stats) {
// 最終更新日時
var lastChanged = Date.parse(stats.ctime);
// 更新の有無のフラグ
var isUpdated = (cache.store[f]) && lastChanged > cache.store[f].timestamp;
// キャッシュの実行
if (!cache.store[f] || isUpdated) {
fs.readFile(f, function(err, data) {
if (!err) {
// キャッシュオブジェクトに詰める
cache.store[f] = {
content: data,// データ
timestamp: Date.now()// 作成日時
};
}
callback(err, data);
});
return;
}
// キャッシュされたデータを返す
callback(null, cache.store[f].content);
console.log("cache: " + f);
});
}
// httpサーバーをつくる
http.createServer(function(request, response) {
// urlを分解する
var parse = path.parse(decodeURI(request.url));
var r = parse.root;// ルート
var d = parse.dir;// ディレクトリ
var f = parse.base;// ファイル名
var e = parse.ext;// 拡張子
var fllPth = path.join(webappPath, r, d, f);// ファイルのフルパス
console.log(fllPth + " was requested");
// ファイルを探す
fs.exists(fllPth, function(exists){
// あったら
if (exists) {
// 読み込み
cacheFile(fllPth, function(err, data) {
// 失敗
if (err) {
response.writeHead(500);
response.end('Server intarnal error occurred');
}
// 成功
response.writeHead(200, {'Content-Type': mimeTypes[e]});
response.end(data);
});
return;
}
// なければ
response.writeHead(404);
response.end(f + ' was not found');
});
cache.clean();// キャッシュのクリーン
}).listen(8081);// 8081ポートでリクエストを受け付ける
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment