next.js 13.4 Panduan pengendalian ralat untuk penghala aplikasi
Artikel ini akan menerangkan cara menggunakan konvensyen fail ralat baru untuk mengendalikan ralat dalam penghala aplikasi di Next.Js.
Pengendalian ralat adalah aspek utama dari mana -mana pembangunan aplikasi web. Pada masa lalu, Next.js membantu pemaju mengendalikan kesilapan dengan menyesuaikan halaman ralat seperti 404 dan 500 muka surat. Walau bagaimanapun, halaman ini mempunyai batasan dalam penghala halaman, seperti sokongan terhad untuk integrasi UI tertentu, sokongan ketinggalan zaman untuk sempadan ralat reaksi, dan fungsi aplikasi terhad apabila ralat berlaku.
Selepas pelepasan versi Next.js 13.4, penghala aplikasi baru telah dimasukkan secara rasmi ke dalam pengeluaran. Router App meningkatkan pengalaman sokongan dan pemaju untuk pengendalian ralat dan bahagian asas bangunan aplikasi web yang lain.
app
dalam direktori error.tsx
membuat sempadan ralat React untuk mengelakkan permohonan daripada terhempas apabila ralat berlaku. Ia juga boleh bertindak sebagai komponen sandaran, membuat kesilapan dilemparkan dalam sempadan. AuthRequiredError
untuk mengendalikan kesilapan pengesahan dalam pelbagai laluan. global-error.tsx
hendaklah digunakan. Jika ralat berlaku dalam komponen pelayan atau semasa pemerolehan data, Next.js meneruskan objek ralat yang sepadan dengan sempadan error.tsx
yang terdekat. Untuk memudahkan pemahaman mengenai API pengendalian ralat baru, kami akan meneroka pelaksanaannya dalam aplikasi Pengesahan Pengguna Seterusnya.
Pengesahan Pengguna terdedah kepada banyak kesilapan, jadi apabila membina aplikasi lain, ia akan memberi manfaat yang besar untuk mempelajari cara menangani kesilapan dalam keadaan ini.
Sebelum memulakan, sila dapatkan kod untuk aplikasi demo yang akan kami gunakan dalam artikel ini dengan mengkloning repositori yang dipautkan di sini (cawangan utama). Selepas menjalankan aplikasi, anda harus melihat ralat yang ditunjukkan dalam imej di bawah.
Nota: Untuk kesederhanaan, pengesahan tidak akan dilaksanakan dalam aplikasi demo.
Ini tentu saja membawa kepada kesilapan, dan sekarang, aplikasi itu benar -benar terhempas kerana ia tidak tahu bagaimana untuk mengendalikan ralat!Sekarang, kita akan belajar bagaimana menangani kesilapan ini untuk mengelakkan permohonan kami terhempas, dengan itu meningkatkan pengalaman pengguna aplikasi dengan ketara.
, eksport fungsi berikut: app/
error.tsx
error.tsx
"use client"; export default function Error() { return ( <div className="grid h-screen px-4 bg-white place-content-center"> <div className="text-center"> <h1 className="font-black text-gray-200 text-9xl">401</h1> <p className="text-2xl font-bold tracking-tight text-gray-900 sm:text-4xl"> 未授权! </p> <p className="mt-4 text-gray-500"> 您必须登录才能访问此页面 </p> <button type="button" className="inline-block px-5 py-3 mt-6 text-sm font-medium text-white bg-indigo-600 rounded hover:bg-indigo-700 focus:outline-none focus:ring" > 重试 </button> </div> </div> ); }
Fungsi yang dieksport akan bertindak sebagai komponen sandaran. Sekiranya ralat dilemparkan dalam sempadan, kesilapan ditangkap dan komponen sandaran diberikan, yang sepatutnya kelihatan seperti di bawah.
"use client"; type ErrorProps = { error: Error; reset: () => void; }; export default function Error({ error, reset }: ErrorProps) { // ... }
kami boleh melaksanakan panggilan fungsi semula dalam butang kami menggunakan pengendali onclick:
<p className="mt-4 text-gray-500"> {error.message || "您必须登录才能访问此页面"} </p>
Dengan cara ini, kami berjaya mengendalikan kesilapan kami!
Mesej ralat abstrak
<button type="button" onClick={() => reset()} className="inline-block px-5 py-3 mt-6 text-sm font-medium text-white bg-indigo-600 rounded hover:bg-indigo-700 focus:outline-none focus:ring cursor-pointer" > 重试 </button>
Dalam aplikasi pengesahan pengguna sebenar, mungkin terdapat banyak laluan yang mesti dilindungi, dan jika ralat pengesahan berlaku, anda perlu menggunakan mesej ralat pengesahan yang sama dalam beberapa keadaan.
Untuk melakukan ini, buat direktori yang dipanggil
dan buat fail yang dipanggildalam direktori itu. Dalam fail ini, kita boleh membuat dan mengeksport pengecualian ralat pengesahan tersuai seperti berikut:
lib
Sekarang, kita boleh membuang adat baru exceptions.ts
di halaman utama dan bukannya biasa
export class AuthRequiredError extends Error { constructor(message = "需要身份验证才能访问此页面") { super(message); this.name = "AuthRequiredError"; } }
AuthRequiredError
Ralat ini akan memberi kita mesej lalai yang diluluskan dalam pembina, atau ralat yang lebih spesifik yang mungkin perlu kita lalui kemudian. Error
export default function Home() { if (!session) throw new AuthRequiredError(); // ... }
Akhirnya, mari kita lihat beberapa tambahan untuk kesilapan susun atur dan pelayan.
fail), dan sistem penghalaan fail yang digunakan oleh Next.js mempengaruhi bagaimana
sempadan berfungsi dalam penghalaan dan susun atur bersarang.
page.tsx
error.tsx
Sifat kesilapan ini menggelegak bermakna sempadan error.tsx
tidak menangkap kesilapan dalam fail susun atur di bahagian yang sama, kerana sempadan ralat membungkus fail susun atur.
seperti yang ditunjukkan dalam angka di bawah. global-error.tsx
dan global-error.tsx
anda sendiri apabila menggunakan fail ini. Batasan ralat ini menangkap sebarang kesilapan yang bersarang sempadan lain tidak ditangkap, jadi ia tidak akan sering diaktifkan.
error.tsx
Ralat pelayan
error.tsx
kesimpulan dan langkah seterusnya
konvensyen fail.
Anda boleh berunding dengan dokumentasi Next.js mengenai pengendalian ralat untuk maklumat lanjut mengenai pengendalian ralat, dan anda juga boleh melihat kod penyelesaian untuk artikel ini di GitHub. error.tsx
(bahagian Soalan Lazim ditinggalkan di sini kerana bahagian Soalan Lazim dari teks asal mempunyai tahap duplikasi yang tinggi dengan kandungan artikel, dan beberapa masalah lemah dikaitkan dengan mekanisme pengendalian ralat penghala aplikasi. Jika perlu, anda boleh menambah mengikut teks asal.)
Atas ialah kandungan terperinci Menguasai Pengendalian Kesalahan Seterusnya.js Dengan Penghala App. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!