해결된 질문
작성
·
157
·
수정됨
0
안녕하세요 next 강의를 거의 마치고 vercel에 배포까지 완료한 후 마지막 강의인 배포 후 최적화를 강사님과 동일하게 작성 후 vercel --prod 명령어를 통해 프로젝트를 다시 배포하였는데 해당 오류가 나타납니다.. ㅠㅠ book 폴더에서 오류가 나는것 같은데 혼자 해결해보려고 했으나, 원인도 잘 모르겠고 검색해도 잘 안나와서 여쭤봅니다..
-오류-
-/book/[id]/page.tsx 코드-
import { notFound } from "next/navigation";
import style from "./page.module.css";
import { BookData, ReviewData } from '@/types';
import ReviewItem from "@/components/review-item";
import ReviewEditor from "@/components/review-editor";
import Image from "next/image";
export async function generateStaticParams() {
const response = await fetch(`${process.env.NEXT_PUBLIC_API_SERVER_URL}/book`);
if(!response.ok) {
throw new Error(response.statusText);
}
const books:BookData[] = await response.json();
return books.map((book) => ({
id: book.id.toString(),
}))
}
async function BookDetail({bookId} :{bookId:string}) {
const response = await fetch(`${process.env.NEXT_PUBLIC_API_SERVER_URL}/book/${bookId}`);
if(!response.ok) {
if(response.status === 404) {
notFound();
}
return <div>오류가 발생했습니다...</div>
}
const book = await response.json();
const { id, title, subTitle, description, author, publisher, coverImgUrl } = book;
return (
<section>
<div
className={style.cover_img_container}
style={{ backgroundImage: `url('${coverImgUrl}')` }}
>
<Image src={coverImgUrl} width={240} height={300} alt={`도서 ${title}의 표지 이미지`} />
</div>
<div className={style.title}>{title}</div>
<div className={style.subTitle}>{subTitle}</div>
<div className={style.author}>
{author} | {publisher}
</div>
<div className={style.description}>{description}</div>
</section>
);
}
async function ReviewList({bookId}:{bookId : string}) {
const response = await fetch(`${process.env.NEXT_PUBLIC_API_SERVER_URL}/review/book/${bookId}`, {next:{tags:[`review-${bookId}`]}});
if(!response.ok) {
throw new Error(`Review fetch failed : ${response.statusText}`);
}
const reviews:ReviewData[] = await response.json();
return (
<section>
{reviews.map((review) => (
<ReviewItem key={`review-item-${review.id}`} {...review} />
))}
</section>
)
}
export async function generateMetadata({ params }: { params: Promise<{ id: string }> }) {
const {id} = await params;
const response = await fetch(`${process.env.NEXT_PUBLIC_API_SERVER_URL}/book/${id}`);
if(!response.ok) {
throw new Error(response.statusText);
}
const book:BookData = await response.json();
return {
title:`${book.title} - 한입북스`,
description:`${book.title}`,
openGraph:{
title:`${book.title} - 한입북스`,
description:`${book.title}`,
images:[book.coverImgUrl],
}
}
}
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
const resolvedParams = await params;
return (
<div className={style.container}>
<BookDetail bookId={resolvedParams.id} />
<ReviewEditor bookId={resolvedParams.id} />
<ReviewList bookId={resolvedParams.id} />
</div>
)
}
답변 2
0
안녕하세요 이정환입니다.
우선 특정 페이지 파일의 코드 만으로는 정확한 문제 원인을 식별하기 어렵습니다 ㅠㅠ
이에 문제를 발생시킬 가능성이 있는 지점을 하나씩 짚어드리도록 할게요! 확인해보세요
로컬에서 빌드 했을 때 아무런 문제가 없는지 가장 먼저 확인해보세요
: 로컬에서 빌드 이슈가 생긴다면, Vercel 플랫폼 환경에서도 문제가 생길 수 밖에 없어요
NEXT_PUBLIC_API_SERVER_URL이 올바르게 설정되어 있는지 가장 먼저 확인해보세요
: Vercel 환경에서는 우리 PC의 localhost에 접근할 수 없으므로, 배포된 백엔드 서버의 주소로 요청을 보내도록 설정하셔야 합니다.
Supabase 프로젝트가 중단되지 않았는지 확인해보세요
: Supabase 프로젝트가 중단 될 경우 프로젝트에서 요청하는 API가 실패할 수 있어요
위 사항들을 모두 점검했는데도 문제가 발생한다면 답글 부탁드립니다.
0
안녕하세요, 인프런 AI 인턴입니다. 최다빈님.
Vercel에 배포 후 발생한 오류에 대한 해결 방법을 알려드리겠습니다. 제공된 코드와 오류 메시지를 기반으로, Next.js와 관련된 몇 가지 문제 해결 방법을 설명드리겠습니다.
비동기 데이터 페칭 문제:
generateStaticParams
, generateMetadata
, 그리고 BookDetail
과 같은 비동기 함수 내에서의 fetch 요청이 문제의 원인이 될 수 있습니다. 이러한 요청이 성공적으로 처리되지 않을 때, 특히 서버에서 500 에러가 발생할 경우, 빌드가 실패할 수 있습니다. API 서버가 정상적으로 작동하고 있는지 확인하셔야 합니다.환경 변수 사용 확인:
process.env.NEXT_PUBLIC_API_SERVER_URL
가 제대로 설정되었는지 확인하세요..env
파일을 통해 올바르게 정의되어 있으며, Vercel에서 환경 변수가 올바르게 설정되어 있는지 확인하셔야 합니다.예외 처리:
fetch
요청에서 실패시 적절한 오류 메시지를 제공하여 원인을 파악할 수 있도록 하는 것이 좋습니다. 예외처리를 통해 오류가 발생했을 때의 상황을 명확하게 로깅해보세요.백엔드 서버 확인:
감지되지 않은 오류:
이와 관련된 기존 질문 및 답변 링크도 첨부드립니다:
- Vercel 배포 시 발생하는 프리렌더링 오류 해결하기
위의 해결 방법들이 도움이 되기를 바랍니다. 문제가 계속된다면 환경 변수 설정이나 API 엔드포인트의 구성을 다시 검토해 보시는 것을 추천드립니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요.곧 지식공유자께서 답변해 주실 것입니다.