Implementar getStaticProps

Necesitamos obtener los datos necesarios para renderizar la publicación con el id dado.

Para hacerlo, abre nuevamente lib/posts.js y agrega la siguiente función getPostData al final. Esta función devolverá los datos de la publicación basados en el id:

export function getPostData(id) {
  const fullPath = path.join(postsDirectory, `${id}.md`);
  const fileContents = fs.readFileSync(fullPath, 'utf8');
 
  // Usa gray-matter para analizar la sección de metadatos de la publicación
  const matterResult = matter(fileContents);
 
  // Combina los datos con el id
  return {
    id,
    ...matterResult.data,
  };
}

Luego, abre pages/posts/[id].js y reemplaza esta línea:

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

con el siguiente código:

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

La página de publicación ahora usa la función getPostData en getStaticProps para obtener los datos de la publicación y devolverlos como props.

Ahora, actualicemos el componente Post para usar postData. En pages/posts/[id].js reemplaza el componente Post exportado con el siguiente código:

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

¡Eso es todo! Intenta visitar estas páginas:

Deberías poder ver los datos del blog para cada página:

Datos del Blog

¡Excelente! Hemos generado con éxito rutas dinámicas.

¿Algo anda mal?

Si encuentras un error, asegúrate de que tus archivos tengan el código correcto:

Si todavía tienes problemas, no dudes en preguntar a la comunidad en GitHub Discussions. Sería útil si pudieras subir tu código a GitHub y compartir el enlace para que otros puedan revisarlo.

Resumen

Nuevamente, aquí está el resumen gráfico de lo que hemos hecho:

Cómo generar páginas estáticamente con rutas dinámicas

Todavía no hemos mostrado el contenido markdown del blog. Hagamos esto a continuación.

On this page