Tại sao cần Backend API riêng?

Không phải nghiệp vụ nào cũng có thể chạy trực tiếp trong trình duyệt. Một số tác vụ bắt buộc phải chạy ở phía server vì lý do bảo mật.

Chạy ở trình duyệt ❌

Mọi người dùng đều thấy code và logic. Không thể giấu API key, mật khẩu, hay quy tắc tính toán.

Chạy ở server ✅

Code chỉ chạy trên máy chủ. Người dùng chỉ nhận được kết quả — không thấy logic bên trong.
Phép so sánh — Máy ATM:
  • Trình duyệt (client) = Màn hình và bàn phím bạn thấy và nhấn
  • Server (API Route) = Bộ xử lý bên trong máy ATM — bạn không thấy, không chạm được
  • Bạn nhập PIN → gửi lên server → server kiểm tra → trả về kết quả “Đúng/Sai”
  • Nếu logic kiểm tra PIN chạy ngay ở màn hình, kẻ xấu có thể can thiệp và làm giả kết quả

Những nghiệp vụ cần chạy ở server


Next.js API Route là gì?

API Route là tính năng của Next.js cho phép bạn viết backend server ngay trong dự án frontend — không cần server riêng.
Phép so sánh — Quán cà phê:
  • Phòng khách (Frontend) = Khu vực khách ngồi, thấy menu, chọn đồ uống
  • Bếp (API Route / Backend) = Nơi pha chế, khách không vào được — công thức bí mật nằm ở đây
  • Bồi bàn (HTTP Request) = Người nhận order từ khách, chuyển vào bếp, mang kết quả ra

Cách hoạt động


Cấu trúc thư mục API Route

Trong Next.js, mỗi file trong thư mục app/api/ trở thành một URL endpoint tự động.
Quy tắc đặt tên: Mỗi folder trong app/api/ cần một file route.ts — đây là file xử lý request. Tên folder trở thành URL path. Ví dụ: app/api/send-email/route.ts → truy cập tại https://yourdomain.com/api/send-email.

Biến môi trường — Nơi cất giữ bí mật

Trước khi đi vào từng nghiệp vụ, bạn cần hiểu biến môi trường — cách an toàn để lưu API key và thông tin nhạy cảm.
Phép so sánh: Biến môi trường giống két sắt trong văn phòng. Code (nhân viên) biết két ở đâu và cách mở — nhưng khách hàng (người dùng) không bao giờ thấy nội dung bên trong.
Quan trọng: File .env.local phải được thêm vào .gitignore — tức là không được đẩy lên GitHub. Nếu API key bị lộ, kẻ xấu có thể dùng dịch vụ của bạn và bạn phải chịu chi phí.
Khi mô tả cho Claude Code:

Các nghiệp vụ bảo mật phổ biến

1. Gửi email

Gửi email cần API key từ dịch vụ như SendGrid, Resend, hoặc Nodemailer. Key này phải giữ bí mật ở server. Các loại email thường gặp:
Học viên đăng ký khóa → server gửi email xác nhận kèm chi tiết khóa học, thời gian, link truy cập.Khi mô tả cho Claude Code:
Tự động gửi email nhắc khi học phí sắp đến hạn hoặc đã quá hạn.Khi mô tả cho Claude Code:
Học viên hoàn thành khóa → server tạo chứng chỉ PDF và gửi kèm email.Khi mô tả cho Claude Code:

2. Thanh toán

Tích hợp thanh toán với VNPay, MoMo, hoặc Stripe đòi hỏi Secret Key phải ở server — lộ ra client là nguy cơ mất tiền ngay lập tức. Luồng thanh toán điển hình: Khi mô tả cho Claude Code:

3. Xuất báo cáo PDF / Excel

Tạo file báo cáo phức tạp cần thư viện nặng — chạy ở server để không làm chậm trình duyệt. Các loại báo cáo phổ biến: Khi mô tả cho Claude Code:

4. Tích hợp AI

Gọi API OpenAI, Gemini, hoặc Claude cần API key bí mật. Logic prompt cũng là tài sản cần bảo vệ. Các ứng dụng AI trong LMS:
Học viên nộp bài tự luận → AI chấm điểm và nhận xét → lưu kết quả Firestore.Khi mô tả cho Claude Code:
Giáo viên nhập nội dung bài học → AI tạo câu hỏi trắc nghiệm, điền từ.Khi mô tả cho Claude Code:
Học viên hỏi bài → AI trả lời dựa trên nội dung khóa học.Khi mô tả cho Claude Code:

5. Webhook — Nhận dữ liệu từ bên ngoài

Webhook là URL mà dịch vụ bên ngoài gọi vào khi có sự kiện xảy ra. Ví dụ: Zalo gọi khi có tin nhắn mới, Stripe gọi khi thanh toán xong.
Phép so sánh: Webhook giống hòm thư tại cửa nhà. Bưu tá (Zalo, Stripe) không cần bạn ra cửa — họ tự bỏ thư vào hòm. Bạn về nhà lấy thư (server nhận và xử lý) bất cứ lúc nào có thư.
Các webhook phổ biến trong LMS: Khi mô tả cho Claude Code:

Bảo mật API Route

API Route là backend — nhưng bạn vẫn cần bảo vệ chúng. Ai có URL cũng có thể gọi nếu không có kiểm soát.

Kiểm tra xác thực (Authentication)

Trước khi xử lý request, luôn kiểm tra người gọi là aicó quyền không. Khi mô tả cho Claude Code:

Giới hạn tần suất (Rate Limiting)

Ngăn người dùng gọi API quá nhiều lần liên tục (tránh spam, tránh lạm dụng).

Xác minh Webhook

Webhook cần xác minh đúng dịch vụ gửi — không phải ai giả mạo URL.

Cấu trúc hoàn chỉnh cho LMS

Đây là cái nhìn tổng thể về tất cả API Route cho một ứng dụng LMS hoàn chỉnh:

Mô tả API Route cho Claude Code

Khi yêu cầu Claude Code tạo API Route, hãy mô tả đủ 4 thành phần:
1

URL và phương thức

Tạo API Route tại /api/email/enrollment-confirm nhận POST request.
2

Dữ liệu đầu vào

Body gồm: studentId (ID học viên), courseId (ID khóa học), startDate (ngày bắt đầu).
3

Quy trình xử lý

  1. Kiểm tra token xác thực → 2. Đọc thông tin từ Firestore → 3. Gửi email → 4. Cập nhật trạng thái.
4

Kết quả trả về

Nếu thành công: { success: true, messageId: "..." }. Nếu lỗi: { error: "Mô tả lỗi" } với HTTP status 400/500.
Ví dụ mô tả hoàn chỉnh:

Câu hỏi thường gặp

API Route không chạy liên tục — chỉ chạy khi có request đến, xong thì tắt. Cơ chế này giống Cloud Functions.Trên Vercel (nơi deploy Next.js phổ biến nhất):
  • Gói miễn phí: 100GB bandwidth, 100K function invocations/tháng
  • Đủ dùng cho LMS nhỏ-trung bình (vài trăm học viên)
  • Khi vượt: khoảng $0.60/triệu lượt gọi — rất rẻ
Có. API Route là URL bình thường — bất kỳ ứng dụng nào cũng gọi được (mobile app, Postman, Python script…).Tuy nhiên, bạn cần kiểm soát CORS (Cross-Origin Resource Sharing) nếu muốn giới hạn chỉ domain của mình gọi được.Khi mô tả cho Claude Code:
Trên Vercel, bạn vào Dashboard → Functions → Logs để xem log thời gian thực.Ngoài ra, yêu cầu Claude Code thêm logging:
Có — khi bạn deploy Next.js lên Vercel, cả trang web (frontend) và API Route (backend) đều chạy trên cùng một hạ tầng, cùng một domain.Ví dụ: Domain https://myapp.com
  • https://myapp.com/dashboard → Trang dashboard (frontend)
  • https://myapp.com/api/send-email → API gửi email (backend)
Điều này giúp đơn giản hóa cấu hình và giảm chi phí — không cần thuê server riêng.

Tóm tắt

Bước tiếp theo: Đọc bài Prompt Rules để hiểu cách mô tả yêu cầu kỹ thuật cho Claude Code một cách hiệu quả nhất.