【发布时间】:2021-06-29 01:52:36
【问题描述】:
我正在我的 Next.js 应用程序中预呈现此页面:
const router = useRouter();
if (!router.isFallback && !postData?.slug) {
return <p>hmm... looks like an error</p>
}
const formatDate = date => {
const newDate = new Date(date);
return `${newDate.getDate()}/${
newDate.getMonth() + 1
}/${newDate.getFullYear()}`
};
return (
<div className={styles.container}>
<Head>
<title>{postData.title}</title>
<link rel='icon' href='/favicon.ico' />
</Head>
<main className={styles.main}>
{router.isFallback ? (
<h2>Loading...</h2>
) : (
<article className={blogStyles.article}>
<div className={blogStyles.postmeta}>
<h1 className={styles.title}>{postData.title}</h1>
<p>{formatDate(postData.date)}</p>
<img src={postData.featuredImage.node.sourceUrl} />
</div>
<div
className='post-content content'
dangerouslySetInnerHTML={{ __html: postData.content }}
/>
</article>
)}
<p>
<Link href={`/blog`}>
<a>Back</a>
</Link>
</p>
</main>
</div>
)
使用getStaticProps()
export async function getStaticProps({ params }) {
const data = await getPost(params.slug);
return {
props: {
postData: data.post
}
};
}
使用getStaticPaths()
export async function getStaticPaths() {
const allPosts = await getAllPostsWithSlug();
if (
allPosts &&
allPosts.edges !== null &&
allPosts.edges.node !== null &&
allPosts.edges.length > 0
) {
return {
paths: allPosts.edges.map(({ node }) => `/blog/${node.slug}`) || [],
fallback: true
}
}
}
当我在本地运行它时,它工作正常,但是当我尝试使用 npm run build 部署它时,它仅针对 title 属性给出错误:
Error occurred prerendering page "/blog/[slug]". Read more: https://err.sh/next.js/prerender-error
TypeError: Cannot read property 'title' of undefined
这是让我感到困惑的部分,因为我不明白为什么错误只出现在查询的 1 个属性 (postData.title) 上,而其他一切都正常加载。
我正在使用 GraphQL 创建查询:
export async function getPost(slug) {
const data = await fetchAPI(
`
fragment PostFields on Post {
title
excerpt
slug
date
featuredImage {
node {
sourceUrl
}
}
}
query PostBySlug($id: ID!, $idType: PostIdType!) {
post(id: $id, idType: $idType) {
...PostFields
content
}
}
`,
{
variables: {
id: slug,
idType: 'SLUG'
}
}
);
return data;
}
我通过一个 api.js 文件导入这个函数,并使用 getStaticProps() 函数中的数据。
对此的任何帮助将不胜感激,我在网上寻找解决方案,但找不到任何有效的解决方案。谢谢!
【问题讨论】:
-
你能显示整个page.js吗?类似于
function home ({postData}){}? -
它只会在
postData.title出错,因为这是您尝试从该页面中的postData访问的第一个属性,出错后它不会到达其他属性。
标签: javascript reactjs graphql next.js server-side-rendering