getServerSideProps

Lorsque vous exportez une fonction appelée getServerSideProps (Rendu côté serveur ou SSR) depuis une page, Next.js pré-rendra cette page à chaque requête en utilisant les données retournées par getServerSideProps. Ceci est utile si vous souhaitez récupérer des données qui changent fréquemment et que vous voulez que la page affiche les données les plus récentes.

import type { InferGetServerSidePropsType, GetServerSideProps } from 'next'

type Repo = {
  name: string
  stargazers_count: number
}

export const getServerSideProps = (async (context) => {
  const res = await fetch('https://api.github.com/repos/vercel/next.js')
  const repo = await res.json()
  return { props: { repo } }
}) satisfies GetServerSideProps<{
  repo: Repo
}>

export default function Page({
  repo,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
  return repo.stargazers_count
}
export async function getServerSideProps() {
  const res = await fetch('https://api.github.com/repos/vercel/next.js')
  const repo = await res.json()
  return { props: { repo } }
}

export default function Page({ repo }) {
  return repo.stargazers_count
}

Vous pouvez importer des modules dans la portée de niveau supérieur pour les utiliser dans getServerSideProps. Les imports utilisés ne seront pas inclus dans le bundle côté client. Cela signifie que vous pouvez écrire du code côté serveur directement dans getServerSideProps, y compris la récupération de données depuis votre base de données.

Paramètre context

Le paramètre context est un objet contenant les clés suivantes :

NomDescription
paramsSi cette page utilise une route dynamique, params contient les paramètres de route. Si le nom de la page est [id].js, alors params ressemblera à { id: ... }.
reqL'objet HTTP IncomingMessage, avec une propriété supplémentaire cookies, qui est un objet avec des clés de type string mappant vers des valeurs de type string des cookies.
resL'objet de réponse HTTP.
queryUn objet représentant la chaîne de requête, incluant les paramètres de route dynamique.
preview(Déprécié pour draftMode) preview est true si la page est en Mode Prévisualisation et false sinon.
previewData(Déprécié pour draftMode) Les données de prévisualisation définies par setPreviewData.
draftModedraftMode est true si la page est en Mode Brouillon et false sinon.
resolvedUrlUne version normalisée de l'URL de requête qui supprime le préfixe _next/data pour les transitions client et inclut les valeurs de requête originales.
localeContient la locale active (si activée).
localesContient toutes les locales supportées (si activées).
defaultLocaleContient la locale par défaut configurée (si activée).

Valeurs retournées par getServerSideProps

La fonction getServerSideProps doit retourner un objet avec une des propriétés suivantes :

props

L'objet props est une paire clé-valeur, où chaque valeur est reçue par le composant de la page. Il doit s'agir d'un objet sérialisable afin que toutes les propriétés passées puissent être sérialisées avec JSON.stringify.

export async function getServerSideProps(context) {
  return {
    props: { message: `Next.js est génial` }, // sera passé au composant de page comme props
  }
}

notFound

Le booléen notFound permet à la page de retourner un statut 404 et une Page 404. Avec notFound: true, la page retournera un 404 même si une page a été générée avec succès auparavant. Ceci est destiné à supporter des cas d'usage comme du contenu généré par l'utilisateur qui serait supprimé par son auteur.

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

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

  return {
    props: { data }, // sera passé au composant de page comme props
  }
}

redirect

L'objet redirect permet de rediriger vers des ressources internes et externes. Il doit correspondre à la forme { destination: string, permanent: boolean }. Dans certains cas rares, vous pourriez avoir besoin d'assigner un code de statut personnalisé pour que les anciens clients HTTP redirigent correctement. Dans ces cas, vous pouvez utiliser la propriété statusCode à la place de la propriété permanent, mais pas les deux.

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: {}, // sera passé au composant de page comme props
  }
}

Historique des versions

VersionChangements
v13.4.0App Router est maintenant stable avec une récupération de données simplifiée
v10.0.0Options locale, locales, defaultLocale, et notFound ajoutées.
v9.3.0getServerSideProps introduit.