【问题标题】:Where am I going wrong with getStaticProps() and getStaticPaths()?getStaticProps() 和 getStaticPaths() 哪里出错了?
【发布时间】:2021-04-27 08:56:45
【问题描述】:

问题

我无法通过 slug 查询 API,它必须通过 id。 KeystoneJS headless CMS 通过 API 提供数据,我的 NextJS 应该在静态生成的 Next.js 应用程序中使用这些数据。 Keystone API 必须像这样查询:

所有帖子:(ALL_POSTS_QUERY)


query {
  allPosts {
    id
    slug
    title
  }
}

单发:(POST_QUERY)

query {
  Post(where: { id: $id }) {
   title
   body
  }
}

我确实使用Apollo Client 连接到 API 端点。

单个帖子的查询必须如上所述格式化,并带有一个 id 变量,这似乎是问题所在。我需要通过 slug 而不是 id 生成静态页面。

功能

getStaticPaths()

export const getStaticPaths = async () => {
  const { data } = await apolloClient.query({
    query: ALL_POSTS_QUERY,
  });

  return {
    paths: data.allPosts.map(({ id, slug }) => ({
      params: { slug: slug },
    })),
    fallback: false,
  };
};

getStaticProps()

export const getStaticProps = async ({ params }) => {
  const id = params.id;
  const { data } = await apolloClient.query({
    query: POST_QUERY,
    variables: {
      id,
    },
  });
  return {
    props: {
      term: data.Post,
    },
  };
};

关于KeystoneJS generated APIs的更多信息。

请帮忙

我对开发非常陌生,所以我对此的理解仍然是基本的。如果我误解了逻辑,请道歉。请任何人都可以帮助我解决我的功能出错的地方吗?我找不到其他人试图通过 slug 构建动态路由,而是通过 id 查询 API 以检索该帖子的数据。

【问题讨论】:

  • 主要问题:nextJS 页面的查询字符串是什么。意思是,打开 nextjs 页面的 URI 看起来如何?是像mydomain.com/bimbom/123 还是像mydomain.com/bimbom?id=123 或者别的什么?请详细说明它的外观。
  • 就像第一个:mydomain.com/posts/slug

标签: next.js apollo-client dynamic-routing


【解决方案1】:

你的问题是你想访问params的propid,但是params.id根本不存在。存在的是params.slug。如果你想通过id,那么把你的代码改成这样:

export const getStaticPaths = async () => {
  const { data } = await apolloClient.query({
    query: ALL_POSTS_QUERY,
  });

  return {
    paths: data.allPosts.map(({ id, slug }) => ({
      params: { id },
    })),
    fallback: false,
  };
};

现在您正在通过id 而不是slug,应该没问题。

【讨论】:

  • 这并没有告诉 Next 为 slug 创建静态路径?它会根据 ID 构建路径吗?
  • 您可以随意命名 slug。它只是变量的名称。
  • 但是我得到了Error: A required parameter (slug) was not provided as a string in getStaticPaths for /posts/[slug],所以我必须通过slug但是我需要通过传递ID来获取数据...
  • 文件名和完整路径是什么?还可以在这里阅读更多信息:nextjs.org/docs/basic-features/…
  • 我已经多次阅读文档,但仍然无法找到通过 slug 构建页面但通过 ID 获取数据的方法。似乎不可能。
猜你喜欢
  • 2020-12-18
  • 2022-11-11
  • 1970-01-01
  • 2016-08-02
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2020-09-28
相关资源
最近更新 更多