如何通过 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 以获取单个实体?的主要内容,如果未能解决你的问题,请参考以下文章