问题描述
我正在创建一个 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
}
}