[Series Thực Chiến E-commerce] Bài 31: Xây dựng kho Content - API Thêm Bài Viết (Add Blog)
Chào bố đời! Nghỉ tay uống ngụm nước rồi anh em mình lại tiếp tục "chiến" nào.
Vậy là cái khung Danh mục (Category) cho Blog đã xong xuôi. Hôm nay, chúng ta chính thức bước vào việc xây dựng phần "thịt" của mảng Content Marketing: Tạo Bài Viết (Add Blog).
Một bài viết Blog trong hệ thống thương mại điện tử không chỉ để đọc cho vui, mà nó gánh trên vai trọng trách rất lớn là SEO (Tối ưu hóa công cụ tìm kiếm) để kéo khách hàng từ Google về web.
Đoạn code Controller của bố đời viết logic cơ bản rất chuẩn, nhưng dưới góc độ thực chiến, nó đang thiếu mất một "vũ khí" cực kỳ quan trọng. Cùng xem đó là gì nhé!
1. Hàm Viết Bài (Controller) & Vũ khí "chuẩn SEO"
Nhìn vào code của bố đời, anh em đã biết cách validate (bắt lỗi) các trường bắt buộc như title, description, và category (nhớ là category này sẽ lưu cái ID của danh mục Blog mà chúng ta tạo ở bài trước nhé).
Tuy nhiên, giống y hệt như Sản phẩm (Product), để đường dẫn bài viết đẹp và Google dễ index, chúng ta bắt buộc phải có trường slug (ví dụ: domain.com/blog/huong-dan-chon-mua-dien-thoai).
Anh em mở filecontrollers/blog.js, gọi thêm thư viện slugify vào và "độ" lại hàm một chút như sau:
const Blog = require('../models/blog'); // Nhớ import Model nhé
const asyncHandler = require('express-async-handler');
const slugify = require('slugify'); // 💡 Vũ khí tối thượng cho SEO
// Tạo blog mới
const createBlog = asyncHandler(async (req, res) => {
const { title, description, category } = req.body;
// Validate đầu vào
if (!title || !description || !category) {
throw new Error('Missing inputs - Thiếu tiêu đề, mô tả hoặc danh mục!');
}
// 💡 GÓC NHÌN THỰC CHIẾN: Tự động sinh Slug từ Title trước khi lưu vào DB
// Frontend chỉ cần gửi 'title', Backend sẽ lo phần tự tạo 'slug'
if (title) {
req.body.slug = slugify(title);
}
// Lưu vào Database
const response = await Blog.create(req.body);
// Phản hồi về Frontend
return res.json({
success: response ? true : false,
createdBlog: response ? response : 'Cannot create new blog - Tạo bài viết thất bại'
});
});
module.exports = {
createBlog,
};
2. Thiết lập Trạm gác (Router) chuẩn bài
Việc đăng bài lên web bán hàng là quyền lực tuyệt đối của Ban quản trị (hoặc đội ngũ Content Creator của công ty). Khách hàng không thể tự tiện lên web của chúng ta viết bài review láo nháo được.
Bố đời đặt 2 cái middleware [verifyAccessToken, isAdmin] ở đây là cực kỳ chính xác!
Anh em tạo filerouters/blog.js và cắm chốt vào:
const router = require('express').Router();
const ctrls = require('../controllers/blog');
const { verifyAccessToken, isAdmin } = require('../middlewares/verifyToken');
// 💡 POST: Chỉ Admin mới được quyền đăng bài
router.post('/blogs', [verifyAccessToken, isAdmin], ctrls.createBlog);
module.exports = router;
Nhớ móc nối vào trạm trung tâm: Đừng quên vào file routers/index.js khai báo thêm router này (ví dụ: app.use('/api/blog', blogRouter)) để hệ thống nhận diện được đường dẫn nhé.
Lời kết
Test trên Postman: Bố đời vác Token của Admin thả vào, bắn method POST tới URLhttp://localhost:5000/api/blog/blogs. Trong Body, quăng cho nó cục JSON:
{
"title": "5 mẹo chọn mua Laptop năm nay",
"description": "Nội dung bài viết dài ngoằng ở đây...",
"category": "điền-id-của-danh-muc-blog-vào-đây"
}
Bấm Send! Data trả về có trường slug là 5-meo-chon-mua-laptop-nam-nay thì anh em cứ tự tin là code chuẩn xịn rồi.
Sau khi đăng bài xong, Content Creator đọc lại thấy sai lỗi chính tả, hoặc muốn update lại nội dung cho mới mẻ thì phải làm sao?
Câu trả lời nằm ở Lession 32: Update Blogs.
All Rights Reserved