如何通过 GraphQL 的“slug”查询单个实体的 API? 查询

问题描述

我正在创建一个 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,因为在访问 posts/[slug].js 时,查询如何知道要查询 API 的什么 slug?

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

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

我将如何根据在 [slug].js 处访问的 slug 将帖子的 ID 传递给查询,这是否意味着我根本无法通过 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 } };
}

我该怎么做?

解决方法

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

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

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

变量:

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

所以我认为你想要:

query($slug: String!) {
  allPosts(where: {slug: $slug}) {
    id
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...