Express服务端如何存储第三方API数据并定时发起更新调用
Express 接口缓存+定时刷新实现方案
核心实现分三个部分,不需要额外安装第三方依赖,用Node原生能力+Express就能完成,完全匹配你的需求:
- 内存缓存层:用普通JS对象存储接口返回数据,服务运行期间全程有效
- 请求兜底逻辑:前端请求时优先返回缓存,无缓存时才调用第三方接口
- 定时刷新任务:固定间隔拉取最新数据更新缓存,保证数据时效性
先修正你现有代码的两处基础错误
cors中间件需要调用后才能生效,你写的app.use(cors)要改成app.use(cors()),否则跨域配置不生效- 你引用接口方法的路径和实际目录不匹配:代码里写的是
./services/getfeaturedMovie.js,但实际文件在api目录下,文件名为getFeaturedMovies.js,注意路径和文件名大小写,否则会报模块找不到的错误
改造后的完整服务端代码
// index.js const express = require("express") const app = express() const port = process.env.PORT || 3001 const cors = require("cors") require("dotenv").config() // 匹配你本地实际的文件路径 const getFeaturedMovies = require("./api/getFeaturedMovies.js") // 内存缓存存储,后续加其他接口只要在这里新增对应key即可 const cache = { featuredMovie: { data: null, lastUpdate: null } } // 缓存自动刷新间隔,单位毫秒,这里默认设为1小时,可根据需求调整 // 注意不要设太短,避免触发TMDB的接口频率限制 const CACHE_REFRESH_INTERVAL = 60 * 60 * 1000 // 封装统一的缓存更新方法 async function updateFeaturedMovieCache() { try { const freshData = await getFeaturedMovies() cache.featuredMovie.data = freshData cache.featuredMovie.lastUpdate = new Date() console.log(`热门电影缓存更新完成,更新时间:${cache.featuredMovie.lastUpdate.toLocaleString()}`) } catch (err) { console.error("热门电影缓存更新失败:", err) // 刷新失败时保留原有缓存,不影响接口正常返回 } } // 服务启动时先拉取一次数据填充缓存,避免第一次请求等待 updateFeaturedMovieCache() // 启动定时任务,按固定间隔刷新缓存 setInterval(updateFeaturedMovieCache, CACHE_REFRESH_INTERVAL) app.use(cors()) app.get("/get-featured-movie", async (req, res) => { // 缓存存在数据时直接返回,不调用第三方接口 if (cache.featuredMovie.data) { return res.json({ success: true, data: cache.featuredMovie.data, cacheUpdateTime: cache.featuredMovie.lastUpdate }) } // 极端场景:服务刚启动首次拉取还未完成时,临时拉取一次数据返回 try { await updateFeaturedMovieCache() return res.json({ success: true, data: cache.featuredMovie.data }) } catch (err) { return res.status(500).json({ success: false, msg: "获取电影数据失败,请稍后重试" }) } }) app.listen(port, () => { console.log(`Mobiusflix server is listening on port ${port}`) })
配套调整说明
- 你自己写的
api/getFeaturedMovies.js需要返回异步请求的结果,也就是要把TMDB接口返回的电影数据return出来,否则缓存更新方法拿不到数据 - 本地开发时React热重载只会刷新前端页面,所有请求打到Express服务端都会走缓存,不会重复调用TMDB接口,只有手动重启Express服务时缓存才会清空
- 如果后续要新增其他接口(比如电影搜索、详情查询),只要在
cache对象里新增对应的缓存字段,再写对应的缓存更新方法即可,逻辑完全复用 - 如果后续需要缓存持久化(比如重启服务也不丢缓存),可以把数据写到本地JSON文件里,你当前学习阶段用内存缓存足够,不需要额外引入Redis这类重型缓存组件
内容的提问来源于stack exchange,提问作者Euphmin
相关产品推荐
相关产品推荐

