0

[Series Thực Chiến E-commerce] Bài 27: Trải thảm đón độc giả - Lấy danh sách Danh mục Blog (Get All Blog Categories)

Chào bố đời! Lại bắt quả tang anh em mải code quá nên copy-paste nhầm đoạn Router của hàm create bài trước sang bài này rồi nhé =))

Không sao cả, chuyện nhầm lẫn dán lộn dòng code là "đặc sản" của nghề Dev rồi. Ở Bài 26, chúng ta đã khởi tạo xong "cái móng" cho hệ thống Blog. Hôm nay, công việc của chúng ta là viết API lấy toàn bộ danh sách các danh mục đó ra. API này chính là thứ mà Frontend sẽ gọi để vẽ ra cái thanh Menu chuyển trang (ví dụ: Tin tức, Khuyến mãi, Review sản phẩm...) cho trang Blog.

Mã nguồn Controller của bố đời đã lên khung rất nét, nhưng mình xin phép thêm một chút "gia vị thực chiến" vào để anh em đi làm dự án thật không bị Frontend "gõ đầu" nhé. Bắt đầu nào!

1. Hàm Query Danh sách (Controller) & Góc nhìn Thực chiến

Logic dùng find() để lấy tất cả là hoàn toàn chính xác. Tuy nhiên, hãy nhìn kỹ vào đoạn if (categories.length === 0) của anh em:

const BlogCategory = require('../models/blogCategory');
const asyncHandler = require('express-async-handler');

// Hàm lấy tất cả danh mục blog
const getAllBlogCategories = asyncHandler(async (req, res) => {
  // Bốc toàn bộ danh mục lên
  const categories = await BlogCategory.find();
  
  // 💡 GÓC NHÌN THỰC CHIẾN (Về mã lỗi 404):
  // Trong thiết kế RESTful API, khi query một danh sách (Array), nếu database trống, 
  // người ta thường trả về Status 200 kèm một mảng rỗng [], thay vì quăng lỗi 404.
  // Tại sao? Vì hệ thống hoạt động bình thường, query thành công, chỉ là "chưa có dữ liệu" thôi.
  // Trả 404 ở đây sẽ làm tab Console của Frontend đỏ lòm, dev Front-end sẽ phải viết thêm try-catch rất cực.
  
  /* Code cũ của anh em:
  if (categories.length === 0) {
    return res.status(404).json({ success: false, message: 'No categories found' });
  }
  */

  // Code tối ưu thân thiện với Frontend:
  return res.status(200).json({
    success: true,
    // Nếu rỗng thì nó tự động là mảng [], Frontend dùng map() render ra UI sẽ không bị lỗi vỡ web
    categories 
  });
});

module.exports = {
  createCategory,
  getAllBlogCategories, // Xuất xưởng
};

2. Sửa lại chốt chặn (Router) cho đúng chuẩn

Như mình đã nhắc ở đầu bài, đoạn code Router bố đời gửi lên đang trỏ vào hàm POST (Tạo mới). Chúng ta đang viết API Lấy dữ liệu (GET) cơ mà!

Hơn nữa, giống y hệt như danh mục sản phẩm, danh mục Blog là thứ Public. Người đọc muốn vào xem tin tức thì chả có lý do gì bắt họ phải có accessToken hay phải là Admin cả. Cửa này phải mở toang!

Anh em sửa lại file routers/blogCategory.js thế này nhé:

const router = require('express').Router();
const ctrls = require('../controllers/blogCategory');
const { verifyAccessToken, isAdmin } = require('../middlewares/verifyToken');

// POST: Tạo danh mục (Bắt buộc Admin)
router.post('/', [verifyAccessToken, isAdmin], ctrls.createCategory);

// 💡 GET: Lấy danh sách danh mục (MỞ PUBLIC)
router.get('/', ctrls.getAllBlogCategories);

module.exports = router;

Lời kết

est trên Postman cực kỳ nhàn rỗi. Anh em chọn method GET, không cần gài Auth Token gì cả, bắn thẳng vào http://localhost:5000/api/blogcategory/. Kết quả trả về một mảng chứa hàng loạt danh mục tin tức là anh em đã thành công mở cổng cho độc giả vào đọc bài rồi.

Đến đây, danh sách đã hiển thị đầy đủ. Nhưng lỡ khách click vào một mục như "Review Sản Phẩm", Frontend cần lấy thông tin chi tiết (hoặc ID) của riêng cái danh mục đó để query bài viết tương ứng thì sao?

Rất quen thuộc đúng không? Đó chính là nội dung của bài tiếp theo: Lession 28: Get All Blog Categories By ID.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí