0

[Series Thực Chiến E-commerce] Bài 22: Bày hàng lên kệ - Lấy danh sách toàn bộ Danh Mục (Get All Categories)

Chào bố đời của tôi! Đang code hăng quá hay sao mà sang Bài 22 lấy danh sách danh mục, bố đời lại quăng nhầm đoạn code createCategory của Bài 21 xuống thế này =))

Không sao, chuyện copy-paste nhầm file lúc đang "cuốn" là bệnh chung của anh em dev chúng ta rồi. Bài toán lấy toàn bộ danh mục này thực ra cực kỳ đơn giản. Nó chính là cái API mà tụi Frontend sẽ gọi đầu tiên khi trang chủ vừa load xong, mục đích là để vẽ ra cái thanh Menu ngang (Header) cho khách hàng biết shop mình đang bán những dòng sản phẩm nào.

Để mình tự tay múa luôn đoạn code chuẩn cho Bài 22 này nhé! Bố đời cứ ngồi nhâm nhi cafe xem thử độ mượt của nó.

1. Hàm "Gom hàng" (Controller)

Giống hệt như lúc lấy danh sách User hay Product, chúng ta chỉ cần gọi hàm find() của Mongoose là toàn bộ các danh mục sẽ được lôi lên mặt nước.

Anh em mở file controllers/productCategory.js và bổ sung thêm hàm này dưới hàm createCategory hôm trước:

// ... (hàm createCategory giữ nguyên)

const getCategories = asyncHandler(async (req, res) => {
  // Dùng find() không truyền điều kiện gì để lấy TẤT CẢ
  // 💡 Tip: Nếu chỉ muốn lấy các trường cần thiết (ví dụ: title, _id) cho nhẹ payload, 
  // anh em có thể nối thêm .select('title _id') vào sau find() nhé.
  const response = await ProductCategory.find();

  return res.status(200).json({
    success: !!response,
    // Nếu mảng rỗng thì trả về mảng rỗng, nếu lỗi thì văng câu thông báo
    categories: response ? response : 'Cannot get product categories' 
  });
});

module.exports = {
  createCategory,
  getCategories, // Nhớ export nó ra ngoài
};

2. Định tuyến mở cửa tự do (Router)

Đây là chỗ anh em rất hay nhầm lẫn nếu cứ code theo quán tính. Ở Bài 21, hành động Thêm mới danh mục yêu cầu quyền Admin tối thượng ([verifyAccessToken, isAdmin]).

Nhưng ở Bài 22 này, hành động Xem danh mục phải là quyền PUBLIC (Công khai). Bất kỳ ai vào web bán hàng (kể cả khách vãng lai chưa tạo tài khoản) cũng phải nhìn thấy thanh Menu để bấm vào xem sản phẩm chứ. Chặn trạm gác ở đây là khách khóc thét bỏ đi luôn!

Anh em mở routers/productCategory.js và nối thêm tuyến đường này:

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

// Route POST: Chỉ Admin mới được tạo danh mục
router.post('/categories', [verifyAccessToken, isAdmin], ctrls.createCategory);

// 💡 Route GET: Mở toang cửa cho tất cả mọi người cùng xem
router.get('/categories', ctrls.getCategories);

module.exports = router;

Lời kết

Test trên Postman cực nhàn: Không cần Auth, không cần Token, cứ chĩa một mũi GET thẳng vào http://localhost:5000/api/category/categories (tùy theo cách anh em setup route ở file index.js). Kết quả trả về một mảng chứa hàng loạt danh mục [{ title: "Điện thoại" }, { title: "Laptop" }...] là xong việc.

Giờ danh mục đã lên menu. Nhưng thi thoảng Frontend hoặc App Mobile lại có nhu cầu: "Ê backend, cho tao xin thông tin chi tiết của đúng cái danh mục có ID này thôi để tao làm màn hình lọc sản phẩm" thì sao?

Đó chính là câu chuyện của bài tiếp theo: Lession 23: Get 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í