Tiếp theo. js 13 sử dụng các tệp đặc biệt để định tuyến. Ví dụ
// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
4 để xây dựng giao diện người dùng và ____25 để tải các thành phầnĐối với lỗi không tìm thấy trang/404, chúng tôi sử dụng tệp
// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
6 đặc biệtTrang 404 tùy chỉnh
Hãy bắt đầu bằng cách thêm trang 404 tùy chỉnh để xử lý lỗi không tìm thấy bài đăng
Tạo một tệp tại
// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
7Đây là cấu trúc tệp sẽ trông như thế nào
//reqres.in/api/users/34"].then[res=>res.json[]]
.then[data=>console.log[data]]0
fetch["//reqres.in/api/users/1"]
.then[ response => response.json[] ]
.then[ data => console.log[data] ]
.catch[ error => console.log[error] ]
Nó xuất hiện sau tất cả các
fetch["//reqres.in/api/users/34"]
.then[res=>res.json[]]
.then[data=>console.log[data]]
1 và được sử dụng để xử lý các lời hứa bị từ chối. Hãy nhớ điều này ở điểm 2 → “Nó xử lý các lời hứa bị từ chối”
Trước tiên, hãy xem điều gì sẽ xảy ra khi chúng tôi truy cập thông tin chi tiết của người dùng không tồn tại. Theo những gì chúng tôi biết, chúng tôi sẽ nhận lại lỗi '404' nói rằng không tìm thấy, phải không?
fetch["//reqres.in/api/users/34"]
.then[res=>res.json[]]
.then[data=>console.log[data]]
Chúng tôi không thấy lỗi hay bất kỳ dữ liệu nào nhưng lời hứa đã được thực hiện. vì vậy bạn có thể nghĩ rằng có một khối
fetch["//reqres.in/api/users/34"]
.then[res=>res.json[]]
.then[data=>console.log[data]]
0 ở cuối sẽ hoạt động, nhưng// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
0Thấy chưa? . Làm cách nào để lệnh bắt có thể xử lý lỗi nếu không có lỗi nào được đưa ra?
Bây giờ, hãy nghĩ về điểm đầu tiên mà tôi muốn bạn ghi nhớ. Theo đó, lỗi 404 không phải là lỗi của
// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
2, vì vậy nó đã thành công trong việc trả lại một lời hứa. Trả lại một lời hứa theo nghĩa, lời hứa không bị từ chối. Theo điểm thứ hai cần ghi nhớ, khối fetch["//reqres.in/api/users/34"]
.then[res=>res.json[]]
.then[data=>console.log[data]]
0 xử lý việc từ chối một lời hứa và do đó nó không xử lý lỗi này vì một lời hứa được trả lại ở đây. Trong hình trên, bạn có thể thấy trạng thái lời hứa là 'đã hoàn thành'. Để xử lý các lỗi như vậy, tìm nạp cung cấp thuộc tính “ok” cho đối tượng phản hồi mà nó trả về. Chúng ta có thể in đối tượng res để xem các chi tiết này
// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
2Trước khi trả về đối tượng phản hồi, chúng ta chỉ cần kiểm tra xem 'ok' được đặt thành true hay false. Nó đại diện cho mã trạng thái của cuộc gọi tìm nạp. Nếu mã trạng thái có dạng
fetch["//reqres.in/api/users/34"]
.then[res=>res.json[]]
.then[data=>console.log[data]]
5, 'ok' sẽ được đặt thành true, nếu không, nó sẽ được đặt thành false [đối với mã trạng thái fetch["//reqres.in/api/users/34"]
.then[res=>res.json[]]
.then[data=>console.log[data]]
6 và fetch["//reqres.in/api/users/34"]
.then[res=>res.json[]]
.then[data=>console.log[data]]
7]// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
6Trạng thái lời hứa là "đã hoàn thành" nhưng chúng tôi đã xử lý lỗi ngay bây giờ.
Bây giờ chúng ta có thể thấy bằng chứng rằng lời hứa bị từ chối và do đó được xử lý bởi khối
fetch["//reqres.in/api/users/34"]
.then[res=>res.json[]]
.then[data=>console.log[data]]
0. Để xem trạng thái lời hứa bị từ chối, hãy xóa khối fetch["//reqres.in/api/users/34"]
.then[res=>res.json[]]
.then[data=>console.log[data]]
0. Ngoài ra, khối in dữ liệu, vì không có gì được sử dụng nếu không có gì được trả về từ khối phản hồi, phải không?// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
9Như bạn có thể thấy, trạng thái của lời hứa bị từ chối và do đó khối bắt có thể xử lý lỗi này. Bạn có thể in phản hồi thay vì trả lại, nhưng bạn sẽ nhận được kết quả tương tự
fetch["//reqres.in/api/users/34"]
.then[res=>res.json[]]
.then[data=>console.log[data]]
0 có thể xử lý các lỗi cú pháp vì nếu cú pháp sai. không thể tìm nạp thành công → vì vậy lời hứa không được trả lại → nên xảy ra lỗi
Ở đây, cú pháp sai, vì vậy, cú pháp bắt lỗi và in ra.
// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
1Tương tự, Lỗi mạng. không có mạng → tìm nạp không thể thành công → vì vậy lời hứa không được trả lại → vì vậy lỗi sẽ xảy ra
// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
2Nhưng URL không hợp lệ sẽ trực tiếp đưa ra lỗi “Mã thông báo không hợp lệ hoặc không mong muốn”, bởi vì quá trình tìm nạp thậm chí không thể bắt đầu quá trình nếu URL sai, chưa nói đến việc trả lại một lời hứa
// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
3Cuối cùng, bạn đã làm đến cùng. Đó là tất cả những gì bạn cần biết về việc xử lý các cuộc gọi không thành công của
// app/posts/[...slug]/page.tsx
import { notFound } from "next/navigation"
function getPostBySlug[slug] {
// ...
}
export default async function PostPage[{ params }] {
const post = await getPostBySlug[params.slug]
if [!post] {
notFound[]
}
return
}
2Hy vọng bạn thích bài viết. Nếu bạn đã làm, hãy cân nhắc cung cấp phản hồi hoặc đề xuất trong phần bình luận. Hãy chắc chắn theo dõi để không bỏ lỡ bất kỳ bài viết nào trong tương lai của tôi. Hãy đón chờ những bài viết thú vị hơn ở phía trước