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

Posted

技术标签:

【中文标题】如何通过 GraphQL 的“slug”查询我的 API 以获取单个实体?【英文标题】:How do I query my API for a single entity by its "slug" with GraphQL? 【发布时间】: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? 【参考方案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
  

【讨论】:

以上是关于如何通过 GraphQL 的“slug”查询我的 API 以获取单个实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 graphql 和 mongodb 的查询中使用“where”参数?

在 Gatsby 中从 graphQL 查询创建 slug

GraphQL / Strapi - 无法按字符串字段过滤

GraphQl 查询问题

GraphQL 请求错误 - 未知参数“slug”

动态 slug 未使用 graphql 和 nuxt 填充 url