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

Next.js构建生成含旧数据的静态文件,如何实现每次请求拉取最新数据?

Next.js App Router 实时获取数据库最新数据解决方案

问题分析

在Next.js App Router中,页面组件默认采用**静态生成(SSG)**策略。执行npm run build时,页面中的异步数据获取逻辑会在构建阶段一次性执行,生成静态HTML文件。后续数据库更新后,静态文件不会自动同步,导致页面无法展示最新数据。而开发模式(npm run dev)下,Next.js默认启用动态渲染,每次请求都会重新执行数据获取逻辑,因此能看到最新数据。

解决方案

要实现每次请求都从数据库拉取最新数据,只需强制页面采用动态渲染策略,以下是两种常用实现方式:

方式一:添加dynamic指令(推荐)

在app/page.tsx顶部添加export const dynamic = 'force-dynamic';,强制Next.js在每次请求时重新渲染页面并执行数据获取逻辑:

修改后的app/page.tsx代码:

import { getGrades } from "@/actions/getGrades";
import { GradesComponent } from "./Grades";

// 强制动态渲染,每次请求都重新获取最新数据
export const dynamic = 'force-dynamic';

export default async function Home() {
  const grades = await getGrades();
  return (
    <div>
      <h1>Grades</h1>
      <p>Grades will be displayed</p>
      <GradesComponent grades={grades} />
    </div>
  );
}

方式二:使用增量静态再生(ISR)(按需刷新)

如果希望页面兼顾性能与数据新鲜度,可以设置revalidate属性,让页面在缓存过期后自动重新获取最新数据(单位:秒):

import { getGrades } from "@/actions/getGrades";
import { GradesComponent } from "./Grades";

// 每60秒重新生成页面,同步最新数据库数据
export const revalidate = 60;

export default async function Home() {
  const grades = await getGrades();
  return (
    <div>
      <h1>Grades</h1>
      <p>Grades will be displayed</p>
      <GradesComponent grades={grades} />
    </div>
  );
}

补充说明

  • dynamic: 'force-dynamic'等价于旧版的getServerSideProps,完全禁用静态缓存,确保每次请求都实时获取数据。
  • revalidate适合数据更新频率不高的场景,既能利用缓存提升性能,又能保证数据不会长期过时。
  • 你的Prisma查询逻辑(getGrades函数)无需修改,已经正确实现了数据库数据的读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:05:07