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