0

0

Next.js App Router 中服务端数据获取的正确方式

碧海醫心

碧海醫心

发布时间:2026-01-02 11:18:08

|

466人浏览过

|

来源于php中文网

原创

Next.js App Router 中服务端数据获取的正确方式

在 next.js 新的 app router 中,`getserversideprops` 已被弃用,应直接在服务端组件中使用 `async/await` 执行数据获取,无需特殊导出函数。

Next.js 13+ 引入的 App Router(基于 React Server Components)彻底重构了数据获取机制。与旧版 Pages Router 中必须通过 getServerSideProps、getStaticProps 等约定式函数导出数据不同,App Router 鼓励在组件内部直接执行异步操作——只要组件是服务端组件(默认行为,且未显式标记 'use client'),其顶层 async function 就会在服务端渲染时自动等待 Promise 解析。

✅ 正确做法:将数据获取逻辑内联至页面组件中
以下是在 app/blah/page.tsx 中获取 GitHub 仓库数据的标准写法:

type Repo = {
  name: string;
  stargazers_count: number;
};

async function fetchRepo(): Promise {
  const res = await fetch('https://api.github.com/repos/vercel/next.js', {
    // 推荐显式设置 cache 策略(可选)
    cache: 'no-store', // 确保每次请求都是新鲜的(SSR 行为)
    // 或使用 'force-cache'(默认,可能触发 ISR 缓存)
  });
  if (!res.ok) {
    throw new Error(`HTTP error! status: ${res.status}`);
  }
  return res.json();
}

export default async function Page() {
  try {
    const repo = await fetchRepo();
    return 
Stargazers: {repo.stargazers_count}
; } catch (error) { console.error('Failed to fetch repo:', error); return
⚠️ 数据加载失败,请稍后重试
; } }

? 关键要点说明:

  • 无需导出 getServerSideProps:该函数在 App Router 中完全无效,会被忽略;
  • 组件必须是 async 函数:Next.js 会自动在服务端执行并等待其返回 JSX;
  • fetch 默认启用服务端缓存:建议根据场景显式配置 cache 选项(如 no-store 实现纯 SSR,force-cache 启用全局缓存);
  • 错误处理不可省略:服务端组件中抛出的异常会中断渲染,需用 try/catch 提供降级 UI;
  • 类型安全仍可保障:可通过 const repo = await fetchRepo() 的返回类型自动推导,无需 InferGetServerSidePropsType。

⚠️ 注意事项:

ChatX翻译
ChatX翻译

最实用、可靠的社交类实时翻译工具。 支持全球主流的20+款社交软件的聊天应用,全球200+语言随意切换。 让您彻底告别复制粘贴的翻译模式,与世界各地高效连接!

下载
  • 若组件中引入了客户端交互(如 useState、useEffect),需添加 'use client' 指令,此时不能再执行 await —— 此类逻辑应移至服务端组件中预取数据,再通过 props 传递给客户端组件;
  • 不要尝试在客户端组件中 await 获取数据(会触发 React 报错),所有异步数据获取必须发生在服务端组件或服务端 Action 中。

总之,App Router 的设计哲学是“简化抽象、贴近原生”,用标准的 async/await 替代魔法函数,让数据流更直观、可调试性更强。掌握这一范式,是高效使用 Next.js 最新版的关键一步。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

519

2023.09.20

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

508

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

241

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

249

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5224

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

470

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.14

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.2万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号