Error UI
Апп ажиллах явцад алдаа гарахаас зайлсхийх боломжгүй — сүлжээ тасрах, өгөгдлийн сан хариу өгөхгүй байх, байхгүй файл унших зэрэг бүх зүйл тохиолдож болно. Next.js-д error.tsx файл нэмэхэд алдааг автоматаар барьж, хэрэглэгчид ойлгомжтой мэдэгдэл харуулна — апп бүхэлдээ унахаас сэргийлдэг.
error.tsx — Автомат алдааны UI
page.tsx-тай нэг директорт error.tsx нэмэхэд тухайн хуудас болон түүний дотор гарсан бүх алдааг барьдаг:
app/
└── courses/
├── page.tsx ← Энд алдаа гарвал...
├── loading.tsx
└── error.tsx ← ...энд барина
error.tsx нь заавал Client Component байх ёстой — алдааны мэдээллийг харуулж, дахин оролдох товч нэмэхэд onClick event хэрэгтэй тул:
// app/courses/error.tsx
"use client";
import { useEffect } from "react";
interface Props {
error: Error & { digest?: string };
reset: () => void;
}
export default function CoursesError({ error, reset }: Props) {
useEffect(() => {
// Алдааг log-д бүртгэх (жишээлбэл Sentry рүү илгээх)
console.error(error);
}, [error]);
return (
<div className="flex flex-col items-center justify-center min-h-[400px] gap-4">
<h2 className="text-xl font-bold text-white">Алдаа гарлаа</h2>
<p className="text-slate-400 text-sm text-center max-w-xs">
Сургалтуудыг ачаалахад алдаа гарлаа. Дахин оролдоно уу.
</p>
<button
onClick={reset}
className="px-4 py-2 bg-indigo-600 text-white rounded-lg hover:bg-indigo-500 transition-colors"
>
Дахин оролдох
</button>
</div>
);
}
reset функцийг дуудахад Next.js тухайн хэсгийг дахин render хийхийг оролдоно — хуудсыг бүхэлд нь дахин ачаалах шаардлагагүй.
error.tsx Props
| Prop | Төрөл | Тайлбар |
| ------- | ----------------------------- | -------------------------------------- |
| error | Error & { digest?: string } | Гарсан алдааны объект |
| reset | () => void | Тухайн хэсгийг дахин render хийх функц |
error.message нь алдааны тайлбар текстийг агуулдаг. Гэхдээ production орчинд энэ текстийг хэрэглэгчид шууд харуулахаас болгоомжил — дотоод мэдээлэл задарч болно.
Global error — Root алдаа
app/layout.tsx-д гарсан алдааг барихад app/global-error.tsx ашиглана. Энэ файл <html> болон <body> тэгийг өөрөө агуулах ёстой:
// app/global-error.tsx
"use client";
export default function GlobalError({
error,
reset,
}: {
error: Error & { digest?: string };
reset: () => void;
}) {
return (
<html lang="mn">
<body className="bg-[#0b1120]">
<div className="flex flex-col items-center justify-center min-h-screen gap-4">
<h1 className="text-2xl font-bold text-white">
Системийн алдаа гарлаа
</h1>
<p className="text-slate-400">Уучлаарай, санаандгүй алдаа гарлаа.</p>
<button
onClick={reset}
className="px-4 py-2 bg-indigo-600 text-white rounded-lg"
>
Дахин оролдох
</button>
</div>
</body>
</html>
);
}
Алдааг санаатайгаар гаргах
Хөгжүүлэлтийн явцад error.tsx зөв ажиллаж байгаа эсэхийг шалгахад Server Component-с алдаа шиддэг:
// app/test/page.tsx — Туршилтын зорилгоор
export default async function TestPage() {
// Энэ алдааг app/test/error.tsx барина
throw new Error("Туршилтын алдаа");
return <div>Энэ харагдахгүй</div>;
}
// app/test/error.tsx
"use client";
export default function TestError({
error,
reset,
}: {
error: Error;
reset: () => void;
}) {
return (
<div className="p-6">
<h2 className="text-white font-bold">Барьсан алдаа:</h2>
<p className="text-red-400 font-mono text-sm mt-2">{error.message}</p>
<button
onClick={reset}
className="mt-4 px-3 py-1 bg-[#1e293b] text-slate-300 rounded text-sm"
>
Дахин оролдох
</button>
</div>
);
}
error.tsx давхарлалт
loading.tsx шиг error.tsx мөн давхарлагдана. Тохирох хамгийн ойр error.tsx-г ашиглана:
app/
├── error.tsx ← Root алдааны UI
└── courses/
├── error.tsx ← /courses/* алдааны UI
└── [courseSlug]/
├── error.tsx ← /courses/[slug]/* алдааны UI
└── [lessonSlug]/
└── page.tsx
Хичээлийн хуудасд алдаа гарвал /courses/[courseSlug]/error.tsx барина. Тэр файл байхгүй бол /courses/error.tsx барина. Мөн байхгүй бол app/error.tsx барина.
Дараагийн хичээлд:
Not Found хуудас судална. notFound() функц болон not-found.tsx файл ашиглан 404 алдааг хэрэглэгчид тааламжтайгаар харуулах аргыг ойлгоно.