我希望有人遇到类似的情况并且可以向我提供正确方向的建议。
我正在使用gatsby构建博客,并从Prismic提取内容。每个博客帖子都有一个作者和通过Prismic Content Relationship与之相关的标签。我的目标是通过gatsby-node为作者动态创建页面,并标记还包括其相关博客文章分页的页面。不幸的是,Prismic似乎并没有建立双向关系,因此我必须通过在allPrismicBlog过滤器上对作者uid进行graphql查询来找到相关的博客文章。
我要完成的网址示例: myblog.com/author/author-name/ myblog.com/author/author-name/2
我的gatsby节点中有以下内容:
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions;
const authors = await graphql(`
{
allPrismicAuthor {
edges {
node {
uid
}
}
}
}
`);
authors.data.allPrismicAuthor.edges.forEach(edge => {
const authorUid = edge.node.uid;
const authorPosts = graphql(`
{
allPrismicBlog(filter: { data: { author: { uid: { eq: ${authorUid} } } } }) {
edges {
node {
uid
}
}
}
`);
const numAuthorPages = Math.ceil(authorPosts.length / 2);
Array.from({ length: numAuthorPages }).forEach((_, i) =>
createPage({
path: i === 0 ? `/author/${authorUid}` : `/author/${authorUid}/${i + 1}`,
component: path.resolve('./src/templates/author.jsx'),
context: {
limit: 2,
skip: i * 2,
numPages,
currentPage: i + 1,
uid: authorUid,
},
}),
);
});
};
我收到错误TypeError: Cannot read property 'page' of undefined
我不确定我要在这里做什么是正确的方向还是我错过了重要的事情。任何帮助将不胜感激。
答案 0 :(得分:0)
上面的代码没有显示任何 page 变量。
也许这样可以帮助我整体上查看代码?
也许您忘记了预先定义 page 变量
答案 1 :(得分:0)
想出了一个解决方案,并希望在这里分享,以防将来其他人遇到类似情况。
我不是在尝试使用作者uid来查询博客文章,而是处理两个查询的异步性质,而是过滤BlogList并基于该列表创建页面。在重构期间,可能有几种方法可以改进此代码,但是想分享我的工作。
const blogList = await graphql(`
{
allPrismicBlog(sort: { fields: [data___blog_post_date], order: DESC }, limit: 1000) {
edges {
node {
uid
data {
author {
uid
}
tag {
uid
}
}
}
}
}
}
`);
const posts = blogList.data.allPrismicBlog.edges;
const authors = await graphql(`
{
allPrismicAuthor {
edges {
node {
uid
}
}
}
}
`);
authors.data.allPrismicAuthor.edges.forEach(edge => {
const authorUid = edge.node.uid;
const authorBlogs = posts.filter(post => post.node.data.author.uid === authorUid);
const numAuthorPages = Math.ceil(authorBlogs.length / 1);
for (let i = 0; i <= numAuthorPages; i++) {
createPage({
path: i === 0 ? `/author/${authorUid}` : `/author/${authorUid}/${i + 1}`,
component: pageTemplates.Author,
context: {
limit: 1,
skip: i * 1,
numPages,
currentPage: i + 1,
uid: authorUid,
},
});
}
});