You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:36:27