Create: Update:
Реализуйте функцию fetchWithCache(url, ttl)
, которая делает HTTP-запрос по заданному URL (используя https
), и кеширует результат в файл.
Если при повторном вызове с тем же URL кеш актуален (время жизни не истекло), функция должна вернуть данные из файла, не обращаясь к сети.
Поведение:
• Результат сохраняется в файл с названием, основанным на URL (можно использовать хеш).
• TTL (time to live) указывается в миллисекундах.
• Если кеш устарел или отсутствует, функция делает реальный HTTP-запрос и обновляет файл.
Решение задачи
const https = require('https');
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
function fetchWithCache(url, ttl) {
const cacheDir = path.resolve(__dirname, 'cache');
const hash = crypto.createHash('md5').update(url).digest('hex');
const cacheFile = path.join(cacheDir, `${hash}.json`);
if (!fs.existsSync(cacheDir)) {
fs.mkdirSync(cacheDir);
}
return new Promise((resolve, reject) => {
if (fs.existsSync(cacheFile)) {
const { mtimeMs } = fs.statSync(cacheFile);
const now =Date.now ();
if (now - mtimeMs < ttl) {
const cached = fs.readFileSync(cacheFile, 'utf-8');
return resolve(JSON.parse(cached));
}
}
https.get(url, res => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
fs.writeFileSync(cacheFile, data, 'utf-8');
resolve(JSON.parse(data));
});
}).on('error', reject);
});
}
// Пример использования:
fetchWithCache('https://jsonplaceholder.typicode.com/todos/1 ', 5000)
.then(data => console.log(data))
.catch(err => console.error(err));