Menu
CoddyTech

Bộ xử lý tuyến đường

Thuộc phần Kiến thức thiết yếu về Next.js trong hành trình React của Coddy. Bài học 37 trên 47.

Các thành phần phía máy chủ đáp ứng hầu hết nhu cầu về dữ liệu vì chúng vốn đã chạy trên máy chủ. Nhưng đôi khi trình duyệt cần yêu cầu dữ liệu sau đó, sau một cú nhấp hoặc khi người dùng ngừng nhập vào hộp tìm kiếm. Khi đó, bạn cần một endpoint để gọi.

Thư mục có tệp route.js bên trong sẽ trở thành đúng đường dẫn đó. Quy tắc định tuyến giống như với các trang, chỉ khác tệp đặc biệt:

app/
    api/
        dishes/
            route.js     ->  /api/dishes

Bên trong, bạn xuất một hàm có tên trùng với phương thức HTTP:

import { dishes } from '../../../lib/dishes.js';

export async function GET() {
    return Response.json(dishes);
}

Response.json(...) là toàn bộ phản hồi: nó tuần tự hóa giá trị và đặt kiểu nội dung JSON. Bạn cũng có thể xuất POST, PUT, DELETE từ cùng một tệp.

Sau đó, phần phía client là code trình duyệt thông thường:

const res = await fetch('/api/dishes');
const data = await res.json();

Có hai điều cần nhớ. Một thư mục có thể chứa page.jsx hoặc route.js, không bao giờ chứa cả hai: cả hai đều sẽ dùng cùng một URL. Và route.js không phải là một thành phần: nó trả về một Response, không phải JSX.

Dùng route handler khi trình duyệt cần dữ liệu theo yêu cầu hoặc khi có thứ gì đó bên ngoài ứng dụng cần gọi vào. Nếu component phía máy chủ có thể đọc dữ liệu ngay khi kết xuất, hãy để nó làm việc đó.

challenge icon

Thử thách

Trung bình

Tạo một API nhỏ và gọi API đó từ trình duyệt.

  1. Trong app/api/dishes/route.js, xuất một async function GET trả về dishes dưới dạng JSON.
  2. Trong components/DishLoader.jsx, hoàn thiện loadDishes: gọi /api/dishes bằng fetch, đọc nội dung JSON và lưu các tên món ăn bằng setNames.

Khi nhấp vào #load-btn, danh sách #dish-list phải hiển thị đủ cả bốn tên.

Tự làm thử

import './globals.css';

export const metadata = {
    title: 'My App',
};

export default function RootLayout({ children }) {
    return (
        <html lang="en">
            <body>
                {children}
            </body>
        </html>
    );
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức thiết yếu về Next.js