1

我正在创建一个 Next.js 博客,它使用使用 KeystoneJS 创建的 API。我对如何从帖子的 slug 获取动态路线上的单个帖子感到非常困惑。

查询

这就是我认为查询应该是的方式:

query Post($slug: String) {
  Post(where: { slug: $slug }) {
    id
  }
}

这是在一个名为的文件中查询的post.service.js

export async function getBySlug(slug) {
  return apolloClient
    .query({
      query: gql`
        query Post($slug: String) {
          Post(where: { slug: $slug }) {
            id
          }
        }
      `,
    })
    .then((result) => {
      return result.data.Post;
    });
}

不出所料,这会导致 ApolloError,因为查询如何知道在访问 API 时要查询什么 slug posts/[slug].js

还值得注意的是 KeystoneJS 在他们的指南中说:

单个实体查询接受必须提供 id 的 where 参数。

我如何根据访问的 slug 将帖子的 ID 传递给查询,[slug].js这是否意味着我根本无法通过 slug 进行查询?

[slug].js正在使用getStaticPaths()并且getStaticProps()喜欢这样:

export async function getStaticPaths() {
  const posts = await getAll();

  const paths = posts.map((post) => ({
    params: { slug: post.slug },
  }));

  return { paths, fallback: false };
}
export async function getStaticProps({ params }) {
  const term = await getBySlug(params.slug);

  return { props: { post } };
}

我怎样才能做到这一点?

4

1 回答 1

1

如果您使用的是where子句而不是匹配 on id,则必须查询allPosts而不是Post.

一个经过测试的示例,通过电子邮件地址匹配用户:

query($email: String!) {
  allUsers(where : {email: $email}){
    id
  }
}

变量:

{
  "email": "user@email.com"
}

所以我想你想要:

query($slug: String!) {
  allPosts(where: {slug: $slug}) {
    id
  }
}
于 2021-02-03T12:45:44.950 回答