我想将 NASA 的这个 api 用于一个小项目:https://api.nasa.gov/neo/rest/v1/neo/browse?api_key=DEMO_KEY
我的问题是,当我想调用这个 API 时,它只显示 20 个项目,我必须使用不同的页码再次调用它以显示另外 20 个项目。我怎样才能缓存这个结果以便我可以立即使用它?
如果文件不存在,则从 NASA API 获取,保存并提供服务 如果有 JSON 文件,它将响应它而不是调用 NASA API。
最大页数为 1768。这是硬编码,但可以工作。
我从响应的
total_pages
值中得到它。
"page": {
"size": 20,
"total_elements": 35374,
"total_pages": 1769,
"number": xxxx
}
此演示代码将用于简单的缓存。
另存为
server.js
const express = require('express');
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const app = express();
const port = 3000;
const apiKey = 'Your API Key';
const maxPages = 1768; // Set the maximum number of pages to prevent over-fetching
app.get('/v1/neo/browse', async (req, res) => {
const page = parseInt(req.query.page, 10);
if (isNaN(page)) {
return res.status(400).send('Valid page query parameter is required');
}
if (page < 0 || page > maxPages) {
return res.status(400).send('Page number is out of range');
}
const filePath = path.join(__dirname, 'responses', `response_page_${page}.json`);
if (fs.existsSync(filePath)) {
res.sendFile(filePath);
} else {
// If the file doesn't exist, fetch from NASA API, save it, and serve
try {
const response = await axios.get(`http://api.nasa.gov/neo/rest/v1/neo/browse?page=${page}&size=20&api_key=${apiKey}`);
// Save the response to a file
const dir = './responses';
if (!fs.existsSync(dir)){
fs.mkdirSync(dir, { recursive: true });
}
fs.writeFileSync(filePath, JSON.stringify(response.data, null, 2));
res.sendFile(filePath);
} catch (error) {
console.error('Error fetching from NASA API: ' + error.message);
res.status(500).send('Error fetching data');
}
}
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
npm install express axios
node server.js
page
可以从0更改为1768
http://localhost:3000/v1/neo/browse/?page=1000
通话后 由于第一次调用,在
response_page_1000.json
目录下创建了 response
。它调用 NASA API 并保存为 json。
如果再次调用同一页面,它不会调用 NASA,只需打开 1000.json 文件并像缓存一样响应。