خطاهای مورد انتظار، خطاهایی هستند که در روند عادی اجرای برنامه رخ میدهند. مثالهای بارز آن شامل خطاهای اعتبارسنجی فرم در سمت سرور (Server-side form validation) یا درخواستهای شبکه ناموفق (Failed requests) است. این خطاها باید به صورت صریح مدیریت شده و نتیجه آنها به کلاینت (Client) برگردانده شود.
توابع سرور (Server Functions)
برای مدیریت خطاهای مورد انتظار در Server Functions، میتوانید از هوک
useActionState استفاده کنید.قانون طلایی: برای این نوع خطاها، به هیچ وجه از بلوکهایtry/catchو دستورthrowاستفاده نکنید. در عوض، خطاهای مورد انتظار را به عنوان مقدار بازگشتی (Return Value) مدلسازی کنید.
// app/actions.ts
'use server'
export async function createPost(prevState: any, formData: FormData) {
const title = formData.get('title')
const content = formData.get('content')
const res = await fetch('https://api.vercel.app/posts', {
method: 'POST',
body: { title, content },
})
const json = await res.json()
if (!res.ok) {
return { message: 'Failed to create post' }
}
}
حالا میتوانید اکشن (Action) خود را به هوک
useActionState پاس دهید و از وضعیت (State) برگشتی برای نمایش پیام خطا به کاربر استفاده کنید.// app/ui/form.tsx
'use client'
import { useActionState } from 'react'
import { createPost } from '@/app/actions'
const initialState = {
message: '',
}
export function Form() {
const [state, formAction, pending] = useActionState(createPost, initialState)
return (
<form action={formAction}>
<label htmlFor="title">Title</label>
<input type="text" id="title" name="title" required />
<label htmlFor="content">Content</label>
<textarea id="content" name="content" required />
{state?.message && <p aria-live="polite">{state.message}</p>}
<button disabled={pending}>Create Post</button>
</form>
)
}
کامپوننتهای سرور (Server Components)
هنگام دریافت داده (Data Fetching) در یک Server Component، میتوانید بر اساس پاسخ دریافتی، یک پیام خطا را به صورت شرطی (Conditional) رندر کنید یا کاربر را به صفحه دیگری هدایت (Redirect) نمایید.
// app/page.tsx
export default async function Page() {
const res = await fetch(`https://...`)
const data = await res.json()
if (!res.ok) {
return 'There was an error.'
}
return '...'
}
مدیریت خطای ۴۰۴ (Not Found)
شما میتوانید تابع
notFound را در یک سگمنت از مسیر (Route Segment) فراخوانی کنید و با استفاده از فایل not-found.tsx، یک رابط کاربری مخصوص خطای ۴۰۴ نمایش دهید.// app/blog/[slug]/page.tsx
import { notFound } from 'next/navigation'
import { getPostBySlug } from '@/lib/posts'
export default async function Page({
params,
}: {
params: Promise<{ slug: string }>
}) {
const { slug } = await params
const post = getPostBySlug(slug)
if (!post) {
notFound()
}
return <div>{post.title}</div>
}
// app/blog/[slug]/not-found.tsx
export default function NotFound() {
return <div>404 - Page Not Found</div>
}
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات