Я бы оставил кэширование до протокола HTTP, так как он предназначен для этого.Просто укажите заголовок ответа ETag
в каждом ответе и добавьте поддержку условных запросов, проверив заголовок запроса If-none-match
.
Хороший способ вычисления тега сущности зависит от способа хранения файлов.В типичной файловой системе * nix значение inode является хорошим началом.
Пример:
fs.stat(filePath, function(err, stats) {
if (err || !stats.isFile()) {
//oops
}
else {
var etag = '"' + stats.ino + '-' + stats.size + '-' + Date.parse(stats.mtime) + '"';
//if etag in header['if-non-match'] => 304
//else serve file with etag
}
});
В особых случаях вы можете даже захотеть кэшировать etag или даже файл в памяти и зарегистрировать обратный вызов fs.watchFile()
, чтобы сделать запись недействительной каккак только файл изменится.