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

Next.js 14+Firebase Admin部署Vercel后API返回旧数据求助

问题分析

你遇到的核心问题是Next.js 14 API路由部署到Vercel后,被静态缓存导致无法获取Firestore最新数据。本地开发时Next.js默认禁用缓存,但Vercel会自动优化静态化API路由,即使你设置了缓存头也可能被覆盖。

解决方案

1. 强制API路由为动态(最关键)

在你的API路由文件顶部添加export const dynamic = 'force-dynamic';,强制Next.js将该API视为动态路由,禁止静态缓存:

'use server';
export const dynamic = 'force-dynamic'; // 新增该行

import { admin } from '@/lib/firebase/firebase-admin-config';

// 剩余代码保持不变...

Next.js 14 App Router中,API路由默认会被静态生成(除非包含动态参数或显式标记为动态),添加这个配置会让Vercel每次请求都执行API逻辑,而非返回缓存的静态响应。

2. 强制Firestore从服务器获取最新数据

Firebase Admin SDK在服务器环境可能会缓存查询结果,你可以在get()方法中指定source: 'server',跳过本地缓存直接请求Firestore服务器:

const snapshot = await admin
  .firestore()
  .collection('panelNewSalePrice')
  .get({ source: 'server' }); // 新增source参数

3. 优化客户端fetch配置

保留核心的禁用缓存配置即可,简化后的请求代码如下:

const res = await fetch(
  `${process.env.NEXT_PUBLIC_BASE_URL}/api/v1/profit-margin`,
  {
    method: 'GET',
    cache: 'no-store', // 禁止客户端缓存
  }
);

next: { revalidate: 1 }主要用于Server Components的数据缓存,若你是在客户端组件中发起请求,该配置作用有限,重点保留cache: 'no-store'即可。

4. 验证Vercel全局缓存规则

登录Vercel控制台,进入项目的Settings > Functions > Edge Cache,检查是否有全局缓存规则覆盖了你的API路由。如果存在,可添加例外规则对/api/v1/profit-margin禁用缓存。

验证步骤
  1. 部署修改后的代码到Vercel
  2. 更新Firestore中panelNewSalePrice集合的数据
  3. 发起API请求,检查返回内容是否为最新数据
  4. 若问题依旧,可在API路由中添加日志(如打印当前时间戳),确认每次请求是否都触发了API逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:07:11