如何解决Next.js 与 Sanity 不构建博客页面
我正在第一次将 Sanity 与 Next.Js 集成,尝试将博客添加到个人网站。 Dev 工作正常,但是当我进行部署或构建时,我收到一个错误,提示它找不到博客页面的道具之一。
抛出的错误是这样的:
TypeError: 无法读取未定义的属性 'title'
这是我用于 [slug].js 文件的内容:
import { useState,useEffect } from 'react';
import { motion } from 'framer-motion';
import Head from 'next/head';
import { useRouter } from 'next/router';
import Layout from '../../components/layout';
import Scrollbar from 'react-scrollbars-custom';
import Transitions from '../../lib/transitions';
import BlockContent from '@sanity/block-content-to-react';
import { postQuery,postSlugsQuery } from '../../lib/grocQueries';
import { getClient,overlayDrafts,sanityClient } from '../../lib/sanity.server';
import { urlForImage,usePreviewSubscription } from '../../lib/sanity';
const pageVariants = Transitions.pageVariant;
const pageTransition = Transitions.pageTransition;
export const Post = ({ data = {},preview }) => {
const router = useRouter();
const slug = data?.post?.slug;
const {
data: { post,morePosts },} = usePreviewSubscription(postQuery,{
params: { slug },initialData: data,enabled: preview && slug,});
return (
<Layout>
<motion.article className='blog-article' initial='initial' animate='in' exit='out' variants={pageVariants} transition={pageTransition}>
<Scrollbar style={{ width: '100%',height: '100%' }}>
<figure className='hero-container'>
<h1 className='blog-title'>{post.title} </h1>
{post.mainImage && <img className='blog-hero' alt='Some alt Text' src={urlForImage(post.mainImage).url()} />}
</figure>
<div className='copy-block'>
<BlockContent blocks={post.body} imageOptions={{ w: 860,fit: 'max' }} {...sanityClient.config()} />
</div>
</Scrollbar>
</motion.article>
</Layout>
);
};
export async function getStaticProps({ params,preview = false }) {
const { post,morePosts } = await getClient(preview).fetch(postQuery,{
slug: params.slug,});
return {
props: {
preview,data: {
post,morePosts: overlayDrafts(morePosts),},};
}
export async function getStaticPaths() {
const paths = await sanityClient.fetch(postSlugsQuery);
return {
paths: paths.map((slug) => ({ params: { slug } })),fallback: true,};
}
export default Post;
解决方法
<figure className='hero-container'>
<h1 className='blog-title'>{post?.title} </h1>
{post?.mainImage && <img className='blog-hero' alt='Some alt Text' src={urlForImage(post?.mainImage).url()} />}
</figure>
在构建期间,接下来不知道 post 对象及其键,因此最好进行可选链接。
,有两件事可能需要在静态生成的页面中添加一个,以便在没有任何道具的情况下知道该怎么做。
在页面中添加道具检查,这样就不会导致构建失败。
if (!props) return null // or !data in your case.
在 getStaticProps 中添加 notFound 返回道具,以便它知道如何正确处理 404。
return {
notFound: true,revalidate: 300,}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。