跳到主要内容

getServerSideProps

当从页面导出一个名为 getServerSideProps(服务端渲染)的函数时,Next.js 将在每次请求时使用 getServerSideProps 返回的数据预渲染此页面。如果你想获取经常更改的数据,并让页面更新以显示最新数据,这非常有用。

pages/index.tsx
import type { InferGetServerSidePropsType, GetServerSideProps } from 'next'

type Repo = {
name: string
stargazers_count: number
}

export const getServerSideProps = (async () => {
// 从外部 API 获取数据
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo: Repo = await res.json()
// 通过 props 将数据传递给页面
return { props: { repo } }
}) satisfies GetServerSideProps<{ repo: Repo }>

export default function Page({
repo,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
return (
<main>
<p>{repo.stargazers_count}</p>
</main>
)
}

你可以在顶层作用域导入模块以在 getServerSideProps 中使用。使用的导入不会为客户端打包。这意味着你可以直接在 getServerSideProps 中编写服务端代码,包括从数据库获取数据。

Context 参数

context 参数是一个包含以下键的对象:

名称描述
params如果此页面使用动态路由params 包含路由参数。如果页面名称是 [id].js,则 params 将类似于 { id: ... }
reqHTTP IncomingMessage 对象,带有一个额外的 cookies prop,它是一个将字符串键映射到 cookies 字符串值的对象。
resHTTP 响应对象
query表示查询字符串的对象,包括动态路由参数。
preview(已弃用,改用 draftMode)如果页面处于预览模式,则 previewtrue,否则为 false
previewData(已弃用,改用 draftMode)由 setPreviewData 设置的预览数据。
draftMode如果页面处于草稿模式,则 draftModetrue,否则为 false
resolvedUrl请求 URL 的规范化版本,去除了客户端转换的 _next/data 前缀,并包含原始查询值。
locale包含活动区域设置(如果已启用)。
locales包含所有支持的区域设置(如果已启用)。
defaultLocale包含配置的默认区域设置(如果已启用)。

getServerSideProps 返回值

getServerSideProps 函数应返回一个包含以下任一属性的对象:

props

props 对象是一个键值对,其中每个值由页面组件接收。它应该是一个可序列化对象,以便传递的任何 props 都可以使用 JSON.stringify 进行序列化。

export async function getServerSideProps(context) {
return {
props: { message: `Next.js is awesome` }, // 将作为 props 传递给页面组件
}
}

notFound

notFound 布尔值允许页面返回 404 状态和 404 页面。使用 notFound: true,即使之前成功生成了页面,页面也会返回 404。这是为了支持用户生成的内容被其作者删除等用例。

export async function getServerSideProps(context) {
const res = await fetch(`https://.../data`)
const data = await res.json()

if (!data) {
return {
notFound: true,
}
}

return {
props: { data }, // 将作为 props 传递给页面组件
}
}

redirect

redirect 对象允许重定向到内部和外部资源。它应该匹配 { destination: string, permanent: boolean } 的形状。在某些罕见情况下,你可能需要为较旧的 HTTP 客户端分配自定义状态码以正确重定向。在这些情况下,你可以使用 statusCode 属性而不是 permanent 属性,但不能同时使用两者。

export async function getServerSideProps(context) {
const res = await fetch(`https://.../data`)
const data = await res.json()

if (!data) {
return {
redirect: {
destination: '/',
permanent: false,
},
}
}

return {
props: {}, // 将作为 props 传递给页面组件
}
}

版本历史

版本变化
v13.4.0App 路由 现在稳定,数据获取更加简化
v10.0.0添加了 localelocalesdefaultLocalenotFound 选项。
v9.3.0引入 getServerSideProps