11 votes

La page Next.js ISR n'est pas supprimée après avoir été supprimée dans le CMS

Je suis en train de tester Next.js et de construire une petite application qui récupère les articles d'une application WordPress sans tête avec GraphQL installé. J'utilise ensuite Apollo/Client pour obtenir le contenu GraphQL :

apollo-client.js

import { ApolloClient, InMemoryCache } from "@apollo/client";

const client = new ApolloClient({
  uri: process.env.WORDPRESS_GRAPHQL_ENDPOINT,
  cache: new InMemoryCache(),
});

export default client;

Dans l'index, je saisis les postes :

index.js

import Head from "next/head";
import styles from "../styles/Home.module.css";

import { gql } from "@apollo/client";
import Link from "next/link";
import client from "../apollo-client";

function Home(props) {
  const { posts } = props;
  return (
    <div className={styles.container}>
      <Head>
        <title>Wordpress blog posts</title>
        <meta
          name="description"
          content="Wordpress blog posts with Apollo Client"
        />
        <link rel="icon" href="http://stackoverflow.com/favicon.ico" />
      </Head>

      <main className={styles.main}>=
        <div className={styles.grid}>
          {posts.map((post) => (
            <a
              key={post.node.databaseId}
              href={`/blog/${post.node.slug}`}
              className={styles.card}
            >
              <h2>{post.node.title}</h2>
              <div dangerouslySetInnerHTML={{ __html: post.node.excerpt }} />
            </a>
          ))}
        </div>
      </main>
    </div>
  );
}

export async function getStaticProps() {
  const { data } = await client.query({
    query: gql`
      query Posts {
        posts {
          edges {
            node {
              title
              databaseId
              slug
              excerpt(format: RENDERED)
            }
          }
        }
      }
    `,
  });

  if (data.posts.edges === 0) {
    return { notFound: true };
  }

  return {
    props: {
      posts: data.posts.edges,
    },
    revalidate: 10,
  };
}

export default Home;

Ensuite, pour la page de l'article unique :

/blog/[slug].js

import Link from "next/link";
import { gql } from "@apollo/client";
import client from "../../apollo-client";

export default function BlogPage(props) {
  const { post } = props;

  if (!post) {
    return <p>Loading...</p>;
  }

  return (
    <div>
      <h1>{post.title}</h1>
      <div dangerouslySetInnerHTML={{ __html: post.content }} />
      <Link href="http://stackoverflow.com/">
        <a>&larr; back to home</a>
      </Link>
    </div>
  );
}

export async function getStaticProps({ params }) {
  const { slug } = params;
  const result = await client.query({
    query: gql`
      query GetWordPressPostBySlug($id: ID!) {
        post(id: $id, idType: SLUG) {
          title
          content
        }
      }
    `,
    variables: { id: slug },
  });

  if (!result.data.post) {
    return { notFound: true };
  }

  return {
    props: {
      post: result.data.post,
    },
    revalidate: 10,
  };
}

export async function getStaticPaths() {
  const result = await client.query({
    query: gql`
      query GetWordPressPosts {
        posts {
          nodes {
            slug
          }
        }
      }
    `,
  });

  return {
    paths: result.data.posts.nodes.map(({ slug }) => {
      return {
        params: { slug },
      };
    }),
    fallback: true,
  };
}

Lorsque j'ajoute un nouveau message, cela fonctionne, mais lorsque je le supprime, il n'est pas supprimé. Cela se produit à la fois lorsque je fais npm run dev y npm run build entonces npm start

Il se peut que je me trompe sur le fonctionnement de l'ISR et de la revalidation. Ou bien j'ai peut-être oublié quelque chose dans mon code ? Toute aide serait appréciée.

-- modifier --

Entre-temps, il y a deux autres fils de discussion, ici sur Stackoverflow et sur le dépôt github de Next.js, liés à ce que je vis. Pages connexes :

Next.js ne supprime pas la page dynamique supprimée dans le CMS

https://github.com/vercel/next.js/issues/25470

La page Next.js ISR n'est pas supprimée après avoir été supprimée dans le CMS

Comment vider le cache GetStaticPaths de NextJs / "dépublier" une route dynamique ?

https://github.com/vercel/next.js/discussions/18967

2voto

PsyGik Points 1234

Je ne sais pas si cela correspond à votre cas d'utilisation, mais dans l'un des projets sur lesquels j'ai travaillé, si les données sources sont supprimées, nous renvoyons un 404.

export async function getStaticPaths() {
  // Get the paths we want to pre-render based on posts
  // We do not need to generate anything during build
  return {
    paths: [],
    fallback: true,
  };
}

export async function getStaticProps({ params: { slug } }) {
  // Run your data fetching code here
  try {
    const data = await getData(slug);
    return {
      props: { data, slug },
      revalidate: 30,
      notFound: !data,
    };
  } catch (e) {
    return {
      props: { data: null, slug },
      revalidate: 30,
      notFound: true,
    };
  }
}

Docs : https://nextjs.org/blog/next-10#redirect-and-notfound-support-for-getstaticprops--getserversideprops

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X