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

Vercel部署页面无法获取MongoDB最新数据求助

Vercel部署后Next.js API路由返回静态缓存数据的解决方法

问题背景

本地运行时,fetchPrompts函数可正常获取MongoDB最新数据,但部署到Vercel后,目标页面仅显示部署初期的数据,新增数据无法加载。已确认MongoDB中存在新增数据,且仅该页面出现此问题,其他页面在本地和部署环境均能正常获取全部数据。将fetch请求添加cache: 'no-cache'参数后可正常获取新数据,同时发现/api/prompt/route.js被处理成静态文件。

原因分析

Vercel部署Next.js应用时,默认会对无动态参数、无特殊配置的API路由进行静态优化,导致API响应被边缘缓存,不会实时从数据库拉取最新数据。而本地开发环境默认禁用此类缓存,因此表现正常。

解决方案

1. 前端fetch请求强制禁用缓存

修改前端的fetch调用,显式添加缓存控制参数,强制每次请求从服务器获取最新数据:

const fetchPrompts = async () => {
  try {
    const response = await fetch('/api/prompt', {
      method: 'GET',
      cache: 'no-cache', // 禁用缓存,强制实时请求
    });
    if (!response.ok) {
      throw new Error('Failed to fetch prompts');
    }
    const data = await response.json();
    setPrompts(data);
    console.log('Prompts:', data);
  } catch (error) {
    setError(error.message);
    console.error('Failed to fetch prompts:', error);
  } finally {
    setLoading(false);
  }
};

2. 后端API路由强制设置为动态

在API路由文件顶部添加dynamic配置,强制Next.js将该路由视为动态路由,禁止静态缓存优化:

import { connectToDatabase } from '@utils/database';
import Prompt from '@models/prompt';

// 强制该API路由为动态模式,禁用静态缓存
export const dynamic = 'force-dynamic';

export const GET = async () => {
  try {
    await connectToDatabase();

    const prompts = await Prompt.find({}).populate('creator');
    return new Response(JSON.stringify(prompts), {
      status: 200,
      headers: { 'Cache-Control': 'no-store, max-age=0' },
    });
  } catch (error) {
    return new Response('Failed to fetch all prompts', { status: 500 });
  }
};

3. 检查Next.js全局配置

确保next.config.js中没有对/api/prompt路由设置静态生成规则,避免覆盖上述动态配置。

说明

硬编码的fetch请求能正常工作,核心原因是添加了cache: 'no-cache'参数,强制浏览器和Vercel边缘节点跳过缓存,直接请求最新数据。而默认的fetch('/api/prompt')调用在Vercel环境下会触发静态缓存策略,导致旧数据被重复返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:57:08