为Express.js的IGDB API查询应用实现缓存系统示例请求
简单实现IGDB查询缓存的示例
Hey there! 我明白你觉得那些缓存库看起来有点复杂,其实不用慌——咱们选个最容易上手的方案,比如apicache,几行代码就能给你的游戏查询接口加上缓存,提升响应速度。
步骤1:安装apicache
在项目根目录运行:
npm install apicache
步骤2:修改你的Express路由/控制器
下面是两种实现方式,选你觉得顺手的就行:
方式1:路由级缓存(最省心)
直接把缓存中间件加到路由上,自动处理缓存逻辑:
const express = require('express'); const router = express.Router(); const apicache = require('apicache'); const client = require('./path-to-your-igdb-client'); // 替换成你的IGDB客户端路径 // 初始化缓存,默认过期时间设为1小时(3600秒) const cacheMiddleware = apicache.middleware; // 自定义缓存键:用查询的关键词作为唯一标识,确保不同关键词缓存不同结果 apicache.options({ defaultDuration: 3600, appendKey: (req) => req.params.text }); // 给你的查询路由加上缓存中间件 router.get('/games/:text', cacheMiddleware('1 hour'), (req, res) => { client.games({ fields: '*', limit: 20, offset: 0, search: req.params.text }) .then(igdbResponse => { res.send(igdbResponse.body); }) .catch(err => { res.status(500).send({ error: '查询游戏失败', details: err }); }); }); module.exports = router;
方式2:手动控制缓存(更灵活)
如果你想在函数内部自己控制缓存逻辑,也可以这样写:
const apicache = require('apicache'); const client = require('./path-to-your-igdb-client'); const cacheStore = apicache.getCache(); // 获取缓存实例 exports.findGameByKeyWord = function(req, res) { const cacheKey = `game-search-${req.params.text}`; // 用关键词生成唯一缓存键 // 先检查缓存 cacheStore.get(cacheKey, (err, cachedData) => { if (cachedData) { // 有缓存直接返回 return res.send(cachedData); } // 没有缓存,调用IGDB API client.games({ fields: '*', limit: 20, offset: 0, search: req.params.text }) .then(igdbResponse => { // 把结果存入缓存,过期1小时 cacheStore.set(cacheKey, igdbResponse.body, 3600, () => {}); res.send(igdbResponse.body); }) .catch(err => { res.status(500).send({ error: '查询游戏失败', details: err }); }); }); };
另一个简单选项:node-cache-manager
如果你不想用apicache,node-cache-manager也是个不错的选择,它支持多种存储(内存、Redis等),内存缓存的实现也很简单:
步骤1:安装node-cache-manager
npm install cache-manager
步骤2:修改你的查询函数
const cacheManager = require('cache-manager'); const client = require('./path-to-your-igdb-client'); // 初始化内存缓存,过期时间1小时 const memoryCache = cacheManager.caching({ store: 'memory', ttl: 3600 }); exports.findGameByKeyWord = function(req, res) { const cacheKey = `game-search-${req.params.text}`; memoryCache.get(cacheKey, (err, cachedResult) => { if (cachedResult) { return res.send(cachedResult); } client.games({ fields: '*', limit: 20, offset: 0, search: req.params.text }) .then(igdbResponse => { memoryCache.set(cacheKey, igdbResponse.body, { ttl: 3600 }, () => {}); res.send(igdbResponse.body); }) .catch(err => { res.status(500).send({ error: '查询游戏失败', details: err }); }); }); };
小提示
- 缓存过期时间可以根据你的需求调整,比如改成
'30 minutes'或者1800秒 - 内存缓存会在服务器重启后清空,如果需要持久化缓存,可以换成Redis存储(apicache和node-cache-manager都支持)
- 别忘了加上错误处理,避免API调用失败时服务器崩溃
内容的提问来源于stack exchange,提问作者Sofiane Hadjadj
相关产品推荐
相关产品推荐

