Implémenter getStaticProps

Nous devons récupérer les données nécessaires pour afficher le post avec l'id donné.

Pour ce faire, ouvrez à nouveau lib/posts.js et ajoutez la fonction getPostData suivante à la fin. Elle retournera les données du post en fonction de l'id :

export function getPostData(id) {
  const fullPath = path.join(postsDirectory, `${id}.md`);
  const fileContents = fs.readFileSync(fullPath, 'utf8');
 
  // Utilise gray-matter pour analyser la section de métadonnées du post
  const matterResult = matter(fileContents);
 
  // Combine les données avec l'id
  return {
    id,
    ...matterResult.data,
  };
}

Ensuite, ouvrez pages/posts/[id].js et remplacez cette ligne :

import { getAllPostIds } from '../../lib/posts';

par le code suivant :

import { getAllPostIds, getPostData } from '../../lib/posts';
 
export async function getStaticProps({ params }) {
  const postData = getPostData(params.id);
  return {
    props: {
      postData,
    },
  };
}

La page de post utilise maintenant la fonction getPostData dans getStaticProps pour obtenir les données du post et les retourner comme props.

Maintenant, mettons à jour le composant Post pour utiliser postData. Dans pages/posts/[id].js, remplacez le composant Post exporté par le code suivant :

export default function Post({ postData }) {
  return (
    <Layout>
      {postData.title}
      <br />
      {postData.id}
      <br />
      {postData.date}
    </Layout>
  );
}

C'est fait ! Essayez de visiter ces pages :

Vous devriez voir les données du blog pour chaque page :

Données du blog

Super ! Nous avons généré avec succès des routes dynamiques.

Un problème ?

Si vous rencontrez une erreur, vérifiez que vos fichiers contiennent le bon code :

Si vous êtes toujours bloqué, n'hésitez pas à demander à la communauté sur GitHub Discussions. Ce serait utile si vous pouviez pousser votre code sur GitHub et fournir un lien pour que d'autres puissent le consulter.

Résumé

Voici à nouveau un résumé graphique de ce que nous avons fait :

Comment générer statiquement des pages avec des routes dynamiques

Nous n'avons pas encore affiché le contenu markdown du blog. Faisons cela ensuite.