[Series Thực Chiến E-commerce] Bài 23: Soi kỹ từng ngóc ngách - Lấy chi tiết Danh mục theo ID
Chào bố đời! Lại tiếp tục cày cuốc với series xây dựng hệ thống e-commerce cực cháy của chúng ta nào.
Làm backend cho các hệ thống thương mại điện tử có lượng sản phẩm và traffic lớn, danh mục (Category) quan trọng y như cái xương sống của trang web vậy. Ở Bài 22, chúng ta đã trải thảm toàn bộ danh mục ra trang chủ rồi. Nhưng khi khách hàng click vào một danh mục cụ thể (ví dụ: "Sữa rửa mặt" hay "Kem chống nắng"), Frontend sẽ cần gọi một API lấy đích danh thông tin của danh mục đó để hiển thị lên tiêu đề trang (Breadcrumb).
Đó là lúc API Get Category By ID ra tay. Đoạn code bố đời chuẩn bị về mặt logic Controller thì cực kỳ "bén", nhưng ở phần Router lại dính một cú lừa quen thuộc. Cùng mổ xẻ nhé!
1. Bắt đúng mạch, lấy đúng hàng (Controller)
Đoạn code Controller này xử lý rất gọn gàng và chuẩn mực. Điểm cộng lớn nhất là anh em đã biết handle lỗi 404 Not Found đàng hoàng thay vì cứ nhắm mắt trả về 200 OK kèm cục data null.
Anh em ném đoạn này vào file controllers/productCategory.js:
// Lấy thông tin chi tiết một danh mục theo ID
const getCategoryById = asyncHandler(async (req, res) => {
// Bốc cái ID từ trên URL xuống (ví dụ: /api/category/categories/12345abc)
const { id } = req.params;
// Đưa ID cho Mongoose đi tìm
const category = await ProductCategory.findById(id);
// 💡 ĐIỂM SÁNG: Xử lý case không tìm thấy (ID sai, hoặc danh mục đã bị xóa)
if (!category) {
return res.status(404).json({
success: false,
message: 'Category not found - Không tìm thấy danh mục này'
});
}
// Tìm thấy thì trả data về cho Frontend vẽ giao diện
return res.status(200).json({
success: true,
category
});
});
module.exports = {
createCategory,
getCategories,
getCategoryById, // Xuất xưởng
};
2. Chốt chặn Router: Cú "tự hủy" vì quen tay
Bây giờ anh em nhìn lại đoạn code Router của mình đi:
router.get('/categories/:id', [verifyAccessToken, isAdmin], ctrls.getCategoryById);
Bố đời ơi, lại quen tay copy-paste hai anh bảo vệ [verifyAccessToken, isAdmin] từ mấy bài trước xuống đúng không? 😂
Giống y hệt Bài 22 (Get All Categories) và Bài 15 (Get Product By ID), hành động Xem thông tin danh mục là một hành động Public (Công khai). Khách vãng lai lướt web click vào danh mục mà server lại báo "Ê, đưa thẻ Admin đây mới cho xem" thì web sập tiệm sớm!
Chỉ khi nào API này được dùng ĐỘC QUYỀN cho trang Dashboard của Admin để lấy data lên form sửa chữa, thì mới chặn. Còn với luồng E-commerce bình thường, anh em cứ mở toang cửa ra cho khách vào nhé.
Sửa lại file routers/productCategory.js cho chuẩn bài:
const router = require('express').Router();
const ctrls = require('../controllers/productCategory');
const { verifyAccessToken, isAdmin } = require('../middlewares/verifyToken');
// POST: Thêm mới danh mục -> CHỈ ADMIN
router.post('/categories', [verifyAccessToken, isAdmin], ctrls.createCategory);
// GET: Lấy tất cả danh mục -> PUBLIC
router.get('/categories', ctrls.getCategories);
// GET: Lấy chi tiết 1 danh mục -> PUBLIC (Bỏ mảng chặn đi nhé)
router.get('/categories/:id', ctrls.getCategoryById);
module.exports = router;
Lời kết
Bật Postman lên, nhặt một cái _id danh mục ném vào đường dẫn GET http://localhost:5000/api/category/categories/<id-vào-đây>. Không cần Auth gì cả, data trả về mượt mà là done task!
Nhìn lại thì chúng ta đã Thêm (Create) và Đọc (Read) danh mục xong rồi. Giai đoạn tiếp theo, lỡ tay gõ sai chính tả tên danh mục thì Admin phải có chỗ để sửa đúng không?
Và đó chính là Lession 24: Update Categories.
All rights reserved