mirror of
https://github.com/hanzoai/next.js.git
synced 2026-09-24 17:00:51 +00:00
c2b4c0815c
This PRs unifies the caching story across the docs, making Cache Components the happy path, while still providing guidance to users in the old model. However, instead of explaining the old model and its caching layers, we've created a new guide focusing on what APIs to use and when. This follow-up PR aligns terminology across the docs: https://github.com/vercel/next.js/pull/90589 ## IA updates Getting Started section: - Improves Getting Started progression: - **Before:** CC → Fetching Data → Updating Data → Caching and Revalidating (old and new model mixed) - **After:** Fetching Data (Dynamic) → Mutating Data (Dynamic) → Caching with CC (Prerendering) → Revalidating with CC. - New: `caching.mdx` (CC-first) - Structure: - Enabling Cache Components - Data vs UI-level caching - Working with request time APIs - Passing request values to cached functions - Working with non-deterministic operations - Working with synchronous operations - How rendering works (PPR and static shell story) - New: `revalidating.mdx` (CC-first) - Explains how to use `cacheLife` and `cacheTag` Guides Section: - New: `caching-and-revalidating.mdx` (Previous Model) - For users who are not using CC, includes `fetch` options and route segment config - Moves route segment config options that don't apply to CC from API reference to this guide (for easy archiving in the future). - New: `migrating-to-cache-components.mdx` (WIP) - Del: `caching.mdx` 😌 ## Terminology We should remove caching layers from the docs. Users only needed to be exposed to them when they were configured independently, but the new CC APIs work across layers. To make it easier to review this PR, I'm consolidating terminology and fixing broken links in a new PR: https://github.com/vercel/next.js/pull/90589 --------- Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com> Co-authored-by: Joseph <[email protected]>
141 lines
7.4 KiB
Plaintext
141 lines
7.4 KiB
Plaintext
---
|
|
title: getServerSideProps
|
|
description: API reference for `getServerSideProps`. Learn how to fetch data on each request with Next.js.
|
|
---
|
|
|
|
When exporting a function called `getServerSideProps` (Server-Side Rendering) from a page, Next.js will prerender this page on each request using the data returned by `getServerSideProps`. This is useful if you want to fetch data that changes often, and have the page update to show the most current data.
|
|
|
|
```tsx filename="pages/index.tsx" switcher
|
|
import type { InferGetServerSidePropsType, GetServerSideProps } from 'next'
|
|
|
|
type Repo = {
|
|
name: string
|
|
stargazers_count: number
|
|
}
|
|
|
|
export const getServerSideProps = (async () => {
|
|
// Fetch data from external API
|
|
const res = await fetch('https://api.github.com/repos/vercel/next.js')
|
|
const repo: Repo = await res.json()
|
|
// Pass data to the page via props
|
|
return { props: { repo } }
|
|
}) satisfies GetServerSideProps<{ repo: Repo }>
|
|
|
|
export default function Page({
|
|
repo,
|
|
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
|
|
return (
|
|
<main>
|
|
<p>{repo.stargazers_count}</p>
|
|
</main>
|
|
)
|
|
}
|
|
```
|
|
|
|
```jsx filename="pages/index.js" switcher
|
|
export async function getServerSideProps() {
|
|
// Fetch data from external API
|
|
const res = await fetch('https://api.github.com/repos/vercel/next.js')
|
|
const repo = await res.json()
|
|
// Pass data to the page via props
|
|
return { props: { repo } }
|
|
}
|
|
|
|
export default function Page({ repo }) {
|
|
return (
|
|
<main>
|
|
<p>{repo.stargazers_count}</p>
|
|
</main>
|
|
)
|
|
}
|
|
```
|
|
|
|
You can import modules in top-level scope for use in `getServerSideProps`. Imports used will **not be bundled for the client-side**. This means you can write **server-side code directly in `getServerSideProps`**, including fetching data from your database.
|
|
|
|
## Context parameter
|
|
|
|
The `context` parameter is an object containing the following keys:
|
|
|
|
| Name | Description |
|
|
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
| `params` | If this page uses a [dynamic route](/docs/pages/building-your-application/routing/dynamic-routes), `params` contains the route parameters. If the page name is `[id].js`, then `params` will look like `{ id: ... }`. |
|
|
| `req` | [The `HTTP` IncomingMessage object](https://nodejs.org/api/http.html#http_class_http_incomingmessage), with an additional `cookies` prop, which is an object with string keys mapping to string values of cookies. |
|
|
| `res` | [The `HTTP` response object](https://nodejs.org/api/http.html#http_class_http_serverresponse). |
|
|
| `query` | An object representing the query string, including dynamic route parameters. |
|
|
| `preview` | (Deprecated for `draftMode`) `preview` is `true` if the page is in the [Preview Mode](/docs/pages/guides/preview-mode) and `false` otherwise. |
|
|
| `previewData` | (Deprecated for `draftMode`) The [preview](/docs/pages/guides/preview-mode) data set by `setPreviewData`. |
|
|
| `draftMode` | `draftMode` is `true` if the page is in the [Draft Mode](/docs/pages/guides/draft-mode) and `false` otherwise. |
|
|
| `resolvedUrl` | A normalized version of the request `URL` that strips the `_next/data` prefix for client transitions and includes original query values. |
|
|
| `locale` | Contains the active locale (if enabled). |
|
|
| `locales` | Contains all supported locales (if enabled). |
|
|
| `defaultLocale` | Contains the configured default locale (if enabled). |
|
|
|
|
## getServerSideProps return values
|
|
|
|
The `getServerSideProps` function should return an object with **any one of the following** properties:
|
|
|
|
### `props`
|
|
|
|
The `props` object is a key-value pair, where each value is received by the page component. It should be a [serializable object](https://developer.mozilla.org/docs/Glossary/Serialization) so that any props passed, could be serialized with [`JSON.stringify`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify).
|
|
|
|
```jsx
|
|
export async function getServerSideProps(context) {
|
|
return {
|
|
props: { message: `Next.js is awesome` }, // will be passed to the page component as props
|
|
}
|
|
}
|
|
```
|
|
|
|
### `notFound`
|
|
|
|
The `notFound` boolean allows the page to return a `404` status and [404 Page](/docs/pages/building-your-application/routing/custom-error#404-page). With `notFound: true`, the page will return a `404` even if there was a successfully generated page before. This is meant to support use cases like user-generated content getting removed by its author.
|
|
|
|
```js
|
|
export async function getServerSideProps(context) {
|
|
const res = await fetch(`https://.../data`)
|
|
const data = await res.json()
|
|
|
|
if (!data) {
|
|
return {
|
|
notFound: true,
|
|
}
|
|
}
|
|
|
|
return {
|
|
props: { data }, // will be passed to the page component as props
|
|
}
|
|
}
|
|
```
|
|
|
|
### `redirect`
|
|
|
|
The `redirect` object allows redirecting to internal and external resources. It should match the shape of `{ destination: string, permanent: boolean }`. In some rare cases, you might need to assign a custom status code for older `HTTP` clients to properly redirect. In these cases, you can use the `statusCode` property instead of the `permanent` property, but not both.
|
|
|
|
```js
|
|
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: {}, // will be passed to the page component as props
|
|
}
|
|
}
|
|
```
|
|
|
|
## Version History
|
|
|
|
| Version | Changes |
|
|
| --------- | ------------------------------------------------------------------------------------------------- |
|
|
| `v13.4.0` | [App Router](/docs/app/getting-started/fetching-data) is now stable with simplified data fetching |
|
|
| `v10.0.0` | `locale`, `locales`, `defaultLocale`, and `notFound` options added. |
|
|
| `v9.3.0` | `getServerSideProps` introduced. |
|