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

Next.js实现每5分钟拉取Steam API数据存入Prisma的方案咨询

结论

该功能完全可以直接在现有Next.js项目中实现,不需要额外新建独立脚本、配置单独的next start启动进程,根据你的部署场景选对应实现方式即可。

可选实现方案

方案1:API路由 + 定时触发(通用方案,适配所有部署环境)

这是最稳妥的方案,不会受Next.js运行时、部署实例数量影响:

  • 先在App Router下新建接口路由,路径可以设为app/api/cron/sync-steam/route.ts,在路由处理函数里写核心逻辑:调用Steam API拉取用户ID列表,通过Prisma做批量写入,写入时开启去重配置避免重复数据报错。记得给接口加简单鉴权,比如校验自定义请求头密钥,防止接口被恶意刷量。
  • 配置每5分钟触发一次这个接口:
    • 如果部署在Vercel这类原生支持Cron配置的平台,直接在根目录vercel.json加如下配置即可,平台会自动按规则调用接口:
      {
        "crons": [
          {
            "path": "/api/cron/sync-steam",
            "schedule": "*/5 * * * *"
          }
        ]
      }
      
    • 如果是Docker、服务器自托管,直接在服务器系统层加crontab规则,每5分钟发一次请求到这个接口地址就行,不需要改动项目代码。

方案2:服务启动时挂载定时任务(仅适合单实例自托管场景)

如果你不想额外配置系统层Cron,可以用Next.js官方提供的启动钩子直接在服务进程里挂载定时任务,正常执行next build && next start就能自动加载,不需要改启动命令:

  • 先安装定时任务依赖:npm install node-cron @types/node-cron
  • 在项目根目录新建instrumentation.ts文件(Next.js服务启动时会自动执行该文件内的注册逻辑),写入如下代码:
    import { PrismaClient } from '@prisma/client'
    import cron from 'node-cron'
    
    const prisma = new PrismaClient()
    const isProdNodeRuntime = process.env.NEXT_RUNTIME === 'nodejs' && process.env.NODE_ENV === 'production'
    
    export async function register() {
      // 仅在生产环境Node.js运行时注册,避免开发模式热重载重复触发、Edge运行时不兼容问题
      if (!isProdNodeRuntime) return
    
      cron.schedule('*/5 * * * *', async () => {
        try {
          // 替换成实际的Steam API请求逻辑
          const res = await fetch(`https://api.steampowered.com/你的接口路径?key=${process.env.STEAM_API_KEY}`)
          const { steamIds } = await res.json()
          // 批量写入数据库,自动跳过重复ID
          await prisma.steamUser.createMany({
            data: steamIds.map(id => ({ steamId: id })),
            skipDuplicates: true
          })
          console.log(`[${new Date().toISOString()}] Steam用户ID同步完成,共处理${steamIds.length}条数据`)
        } catch (e) {
          console.error('Steam数据同步失败:', e)
        }
      })
      console.log('Steam同步定时任务已挂载,执行间隔5分钟')
    }
    
  • 如果用的是Pages Router,你也可以把这段注册逻辑写到自定义server.js里,效果一致,但不如官方提供的instrumentation钩子简洁。
避坑提示
  • 不要把定时任务逻辑写到页面组件、客户端组件里,否则每个访问页面的用户都会触发一次逻辑,会造成重复请求、数据库写入冲突。
  • 多实例部署时不要用方案2,否则每个服务实例都会独立跑定时任务,造成重复拉取写入,这种场景优先选方案1。
  • Steam API调用要加超时、异常捕获和重试逻辑,避免单次接口请求失败导致整个任务中断。
  • Prisma批量写入时必须开skipDuplicates: true,避免重复拉取到相同用户ID时触发主键冲突报错。

内容的提问来源于stack exchange,提问作者ccc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:09:39