[Series Thực Chiến E-commerce] Bài 28: Soi kỹ từng chuyên mục - Lấy chi tiết Danh mục Blog theo ID
Chào bố đời! Tốc độ ra bài của anh em mình đúng là không đùa được đâu.
Hôm trước ở Bài 27, chúng ta đã rải một tấm thảm đỏ, show toàn bộ danh mục Blog ra cho độc giả chọn. Thế nhưng, khi độc giả click vào danh mục "Mẹo vặt công nghệ", Frontend sẽ cần một API để bốc chính xác thông tin (như ID, Title) của cái danh mục đó lên để gắn vào tiêu đề trang và query các bài viết thuộc danh mục đó.
Đó chính là sân khấu của API Get Blog Category By ID. Đoạn code Controller của bố đời rất nét, nhưng sang đến file Router thì hình như "lời nguyền copy-paste" lại linh ứng rồi! Cùng mình mổ xẻ nhé.
1. Hàm "Trích xuất" chuẩn xác (Controller)
Đoạn logic bốc data theo ID này anh em viết rất mượt. Đặc biệt là pha handle lỗi 404 Not Found cực kỳ đáng khen. Làm Backend thì phải luôn phòng hờ trường hợp Frontend gửi lên một cái ID sai, hoặc danh mục đó đã bị Admin xóa từ đời nào rồi.
Anh em quăng đoạn này vào file controllers/blogCategory.js:
// Hàm lấy thông tin chi tiết một danh mục blog theo ID
// 💡 Góp ý nhỏ: Đổi tên hàm thành getBlogCategoryById (bỏ chữ 's' ở Categories) cho chuẩn ngữ nghĩa nhé, vì mình chỉ lấy 1 cái thôi!
const getBlogCategoryById = asyncHandler(async (req, res) => {
// Lấy ID từ thanh URL (params)
const { id } = req.params;
// Truy vấn DB
const category = await BlogCategory.findById(id);
// Xử lý ngoại lệ nếu không tìm thấy
if (!category) {
return res.status(404).json({
success: false,
message: 'Category not found - Chuyên mục này không tồn tại'
});
}
// Trả data về cho Frontend
return res.status(200).json({
success: true,
category
});
});
module.exports = {
createCategory,
getAllBlogCategories,
getBlogCategoryById, // Đưa em nó ra ánh sáng
};
2. Gỡ bỏ Trạm gác "Oan uổng" (Router)
Đến đây, anh em nhìn lại đoạn code Router của mình xem:
router.get('/blogscategories/:id', [verifyAccessToken, isAdmin], ctrls.getBlogCategoriesById);
Bố đời ơi, danh mục Blog là để cho độc giả bốn phương vào đọc tin tức mà! Ai lại bắt độc giả phải có thẻ Admin (hay thậm chí là bắt đăng nhập) mới được xem tên chuyên mục thế này? Bê nguyên hai anh gác cổng [verifyAccessToken, isAdmin]vào đây là Frontend khóc thét, khách hàng bỏ chạy hết đấy =))
Ngoài ra, đường dẫn URL cũng hơi thừa thãi. Nếu ở file index.js gốc mình đã quy định root là /api/blogcategory rồi, thì vào đây chỉ cần /:id là đủ, không cần lặp lại chữ blogscategories nữa.
Anh em sửa lại file routers/blogCategory.js cho gọn gàng và chuẩn bài Public nhé:
const router = require('express').Router();
const ctrls = require('../controllers/blogCategory');
const { verifyAccessToken, isAdmin } = require('../middlewares/verifyToken');
// POST: Thêm chuyên mục (Độc quyền Admin)
router.post('/', [verifyAccessToken, isAdmin], ctrls.createCategory);
// GET: Lấy tất cả chuyên mục (Mở Public)
router.get('/', ctrls.getAllBlogCategories);
// 💡 GET: Lấy chi tiết 1 chuyên mục (Mở Public luôn, tháo chốt bảo vệ ra!)
router.get('/:id', ctrls.getBlogCategoryById);
module.exports = router;
Lời kết
Test trên Postman: Bố đời vác một cái _id của danh mục Blog nào đó, thả vào GET http://localhost:5000/api/blogcategory/<id>. Data trả về cái rụp mà không đòi hỏi Token gì là anh em đã thành công 100%.
Việc Đọc (Read) và Thêm (Create) danh mục Blog coi như đã êm xuôi. Nhưng viết content thì không tránh khỏi sai sót, lỡ đặt tên chuyên mục bị sai hoặc muốn đổi tên cho bắt trend thì phải làm sao?
Tất nhiên là phải gọi tính năng Update rồi!
All Rights Reserved