reactjs - Next.js ISR页面在CMS中删除后没有被删除

标签 reactjs next.js getstaticprops getstaticpaths

我正在尝试 Next.js 并构建一个小应用程序,该应用程序从安装了 GraphQL 的 headless WordPress 应用程序中获取帖子。
然后我使用 Apollo/Client 来获取 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;
在索引中,我捕获了帖子:
索引.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="/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;
然后对于单个帖子页面:
/博客/[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="/">
        <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,
  };
}
添加新帖子时它有效,一旦我删除它,它就不会被删除。执行 npm run dev 时都会发生这种情况和 npm run build然后 npm start我可能在 ISR 和重新验证的工作方式方面遇到了一些问题。或者我可能在我的代码中遗漏了什么?
任何帮助,将不胜感激。
- 编辑 -
与此同时,还有更多线程,这里是 Stackoverflow 和 Next.js github 存储库,与我所经历的有关。
相关页面:
Next.js does not delete dynamic page deleted in CMS
https://github.com/vercel/next.js/issues/25470
Next.js ISR page not being deleted after deleting it in CMS
How to clear NextJs GetStaticPaths cache / "unpublish" a dynamic route?
https://github.com/vercel/next.js/discussions/18967

最佳答案

我不确定这是否符合您的用例,但在我参与的其中一个项目中,如果源数据被删除,我们将返回 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,
    };
  }
}
文档:https://nextjs.org/blog/next-10#redirect-and-notfound-support-for-getstaticprops--getserversideprops

关于reactjs - Next.js ISR页面在CMS中删除后没有被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67864802/

相关文章:

javascript - 需要 jsx 文件而不指定扩展名

javascript - 如何在 NextJs 中生成 UUID?

reactjs - Next.js getStaticProps 与 SWR "Error serializing ` .initialData.config.transformRequest[0 ]` returned from ` getStaticProps`"

reactjs - Next Js Router.push 不是函数错误

typescript - 如何使 Next.js getStaticProps 与 typescript 一起使用

reactjs - 如何根据Next.js中pages目录下的文件生成菜单

javascript - 虚拟 DOM 如何提高 ReactJS 的速度?

javascript - 为什么即使一个组件的 z-index 值大于其他目标组件,CSS z-index 属性也不起作用?

javascript - react native : ListView renders before dataSource being set

reactjs - 如何将自定义参数传递给 nextjs 动态路由,以便我可以在 getInitialProps 中访问它