【问题标题】:How do I query my API for a single entity by its "slug" with GraphQL?如何通过 GraphQL 的“slug”查询我的 API 以获取单个实体?
【发布时间】:2021-04-26 00:15:02
【问题描述】:

我正在创建一个 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 } };
}

我该怎么做?

【问题讨论】:

  • 你设法让这个工作@Anthony?

标签: graphql next.js apollo keystonejs dynamic-routing


【解决方案1】:

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

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

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

变量:

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

所以我想你想要:

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

【讨论】:

    猜你喜欢
    • 2020-05-21
    • 2020-01-20
    • 1970-01-01
    • 2019-08-28
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    相关资源
    最近更新 更多