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

Next.js Serverless API部署Vercel后无法自动更新数据求助

问题解决:Vercel部署后Next.js GET API返回旧数据

核心原因

Vercel 默认会对 Next.js App Router 的 API 路由进行静态优化或边缘缓存,即使你在响应头设置了Cache-Control,也可能被平台级缓存覆盖,导致返回构建时的旧数据。

解决方案

1. 在GET API路由文件中添加动态渲染指令

把export const dynamic = "force-dynamic"加到API路由文件顶部,强制每次请求都执行服务器端逻辑,跳过缓存:

import { connectDB } from "@/lib/connectDB";

// 强制API路由动态渲染,每次请求都重新执行
export const dynamic = "force-dynamic";

export const GET = async () => {
  try {
    const db = await connectDB();
    const blogs = await db.collection("blogs").find().toArray();
    return new Response(JSON.stringify(blogs), {
      status: 200,
      headers: {
        "Content-Type": "application/json",
        "Cache-Control": "no-store, max-age=0",
      },
    });
  } catch (error) {
    return new Response(
      JSON.stringify({ message: "Error fetching blogs", error }),
      { status: 500 }
    );
  }
};

2. 确认fetch请求的缓存配置

保留客户端fetch请求的缓存配置,确保双重禁用缓存:

const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/blogs/api`, {
  cache: "no-store",
  next: {
    revalidate: 0,
  },
});

3. 检查数据库连接的缓存问题

如果你的connectDB函数用了全局缓存(比如把db实例存在全局变量),可能导致读取旧数据。确保连接逻辑每次调用都能返回有效引用:

// 示例connectDB正确写法(避免全局缓存导致的旧连接)
import { MongoClient } from "mongodb";

let client;
let db;

export async function connectDB() {
  if (!client) {
    client = new MongoClient(process.env.MONGODB_URI);
    await client.connect();
  }
  db = client.db(process.env.MONGODB_DB);
  // 确保每次调用都返回最新的db引用
  return db;
}

4. 手动触发缓存失效(补充方案)

在POST请求完成后,调用revalidateTag标记缓存失效,确保数据更新后能立即获取新内容:

// 在POST API路由中添加
import { revalidateTag } from "next/cache";

export const POST = async (req) => {
  // ... 你的POST逻辑,存入数据库后
  revalidateTag('blogs');
  return new Response(JSON.stringify({ message: "Blog created" }), { status: 201 });
};

// 同时在GET请求的fetch中添加tags
const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/blogs/api`, {
  next: {
    tags: ['blogs'],
    revalidate: 0,
  },
});

关键注意点

  • dynamic = "force-dynamic"必须加在API路由文件里,之前你加在首页是无效的。
  • Vercel边缘缓存可能有延迟,部署后建议等待1-2分钟再测试,也可以在Vercel控制台手动清除缓存(设置 -> 缓存 -> 清除缓存)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:22:05