Created
July 18, 2015 00:51
-
-
Save tak1827/f0fc9abc761ce59195c6 to your computer and use it in GitHub Desktop.
キャッシュ機能ありの簡易Httpサーバー
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 必要なモジュールの読み込み | |
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