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



我正在创建一个使用KeystoneJS创建的API的Next.js博客。我非常困惑,我如何从帖子的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的哪个段塞呢?

同样值得注意的是,KeystoneJS在他们的指南中说:

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

我如何将帖子的ID传递给查询,这取决于在[slug].js访问了什么段塞,这是否意味着我根本不能通过段塞进行查询?

[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
}
}

相关内容

  • 没有找到相关文章

最新更新