
Chào các genZ developer tương lai, hôm nay anh Creyt sẽ "bóc phốt" một khái niệm mà các em sẽ gặp như cơm bữa khi làm backend với Node.js và Express: req.body. Nghe có vẻ khô khan nhưng anh hứa sẽ làm nó dễ hiểu như cách các em lướt TikTok vậy!
req.body là gì? "Hộp quà" bí ẩn từ Client
Để anh Creyt kể cho nghe, trong thế giới web, khi client (trình duyệt web, ứng dụng di động của mấy đứa) muốn gửi dữ liệu lên server của mình, có nhiều cách. Có thể là gửi qua URL (req.query), gửi qua đường dẫn (req.params), nhưng những cách đó thường chỉ để gửi dữ liệu nhỏ, công khai, hoặc để định danh thôi.
Còn khi mấy đứa muốn gửi một "gói hàng" lớn hơn, phức tạp hơn, hoặc "nhạy cảm" hơn – ví dụ như tên đăng nhập và mật khẩu, nội dung một bài post dài ngoằng, hay cả một object sản phẩm với ti tỉ thuộc tính – thì đó chính là lúc req.body vào vai.
req.body chính là cái "hộp quà đóng gói kỹ lưỡng" mà client gửi kèm theo các yêu cầu HTTP như POST, PUT, PATCH. Nó chứa toàn bộ dữ liệu mà client muốn "nhét" vào yêu cầu để server xử lý. Dữ liệu này không hiển thị trên URL, giúp giữ cho URL "sạch sẽ" và bảo mật hơn cho các thông tin nhạy cảm.
Để làm gì? Khi bạn muốn Server "nuốt" dữ liệu lớn
Đơn giản là để server của bạn có thể nhận và xử lý dữ liệu được gửi từ client một cách "kín đáo" và có cấu trúc. Tưởng tượng bạn đi siêu thị mua đồ, req.query là cái list ghi chú dán bên ngoài túi, còn req.params là cái tem dán mã vạch. req.body chính là tất cả những món đồ thật sự bên trong cái túi đó. Server cần biết bên trong có gì để biết cách sắp xếp, chế biến.
"Người bóc quà" - Middleware
À mà khoan, server không tự nhiên mà hiểu được "ngôn ngữ" của cái hộp quà đâu nha. Dữ liệu trong req.body thường được đóng gói dưới nhiều định dạng khác nhau như JSON (application/json) hoặc form URL-encoded (application/x-www-form-urlencoded). Server của bạn cần một "người giải mã" hay "người bóc quà" chuyên nghiệp để mở cái hộp đó ra và biến nó thành một object JavaScript mà bạn có thể dễ dàng làm việc.
Trong Express.js, những "người bóc quà" này chính là các middleware như express.json() và express.urlencoded(). Nếu không có chúng, req.body của bạn sẽ chỉ là undefined hoặc một object rỗng tuếch, server sẽ "đứng hình" không biết client đang gửi cái gì đâu.

Code Ví Dụ Minh Hoạ: Bóc quà cùng Creyt
Đây, anh Creyt sẽ cho mấy đứa thấy cách server "bóc quà" như thế nào:
Đầu tiên, cài đặt Express và tạo file app.js:
npm init -y
npm install express
app.js (Server-side):
const express = require('express');
const app = express();
const port = 3000;
// Middleware "bóc quà" JSON
app.use(express.json());
// Middleware "bóc quà" Form URL-encoded
// { extended: true } cho phép parse các object và array lồng nhau
app.use(express.urlencoded({ extended: true }));
// Route xử lý POST request để tạo một bài viết mới
app.post('/posts', (req, res) => {
console.log('Dữ liệu từ req.body:', req.body);
// Ví dụ dữ liệu mong muốn từ client:
// { title: "Tiêu đề bài viết", content: "Nội dung chi tiết...", author: "Creyt" }
const { title, content, author } = req.body;
if (!title || !content) {
return res.status(400).json({ message: 'Tiêu đề và nội dung không được để trống!' });
}
// Ở đây, mấy đứa sẽ lưu dữ liệu vào database thật
// Tạm thời, chúng ta chỉ gửi lại xác nhận
const newPost = {
id: Math.floor(Math.random() * 1000),
title,
content,
author: author || 'Anonymous',
createdAt: new Date()
};
res.status(201).json({ message: 'Bài viết đã được tạo thành công!', post: newPost });
});
// Route xử lý PUT request để cập nhật thông tin người dùng
app.put('/users/:id', (req, res) => {
const userId = req.params.id;
const { name, email, bio } = req.body;
console.log(`Cập nhật người dùng ${userId} với dữ liệu:`, req.body);
if (!name || !email) {
return res.status(400).json({ message: 'Tên và email không được để trống!' });
}
// Logic cập nhật database ở đây
const updatedUser = {
id: userId,
name,
email,
bio: bio || 'No bio provided',
updatedAt: new Date()
};
res.json({ message: `Người dùng ${userId} đã được cập nhật thành công!`, user: updatedUser });
});
app.listen(port, () => {
console.log(`Server đang chạy tại http://localhost:${port}`);
});
Cách gửi dữ liệu từ Client (Dùng curl hoặc fetch):
1. Gửi dữ liệu JSON (thường dùng cho API):
curl -X POST -H "Content-Type: application/json" \
-d '{"title": "Bài viết đầu tiên của GenZ", "content": "Nội dung cực chất về req.body", "author": "Creyt"}' \
http://localhost:3000/posts
2. Gửi dữ liệu Form URL-encoded (thường dùng cho form HTML truyền thống):
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
-d "title=Bài+viết+thứ+hai&content=Nội+dung+dạng+form" \
http://localhost:3000/posts
3. Gửi PUT request để cập nhật:
curl -X PUT -H "Content-Type: application/json" \
-d '{"name": "Creyt Dev", "email": "creyt@example.com", "bio": "Giảng viên lập trình dí dỏm"}' \
http://localhost:3000/users/123
Khi chạy các lệnh curl này, mấy đứa sẽ thấy server in ra req.body trong console và trả về phản hồi tương ứng. Tuyệt vời chưa!
Mẹo & Best Practices (Công thức của Creyt)
- Đừng bao giờ quên Middleware: Đây là điều tối quan trọng! Nếu mấy đứa muốn
req.bodycó dữ liệu, hãy luôn thêmapp.use(express.json());vàapp.use(express.urlencoded({ extended: true }));vào đầu file server của mình (trước các route). Không có chúng,req.bodysẽ làundefinedvà mấy đứa sẽ tốn cả buổi debug đấy. - "Đừng tin bất cứ thứ gì đến từ client": Đây là câu thần chú của anh Creyt. Dữ liệu từ
req.bodyluôn cần được xác thực (validate) và làm sạch (sanitize). Client có thể gửi bất cứ thứ gì, từ dữ liệu thiếu, sai định dạng đến các đoạn mã độc. Luôn kiểm tra xemtitlecó rỗng không,emailcó đúng định dạng không, v.v. trước khi xử lý hoặc lưu vào database. (Hãy dùng thư viện nhưJoihoặcexpress-validator). - Hiểu
Content-Type: Client gửiContent-Typenào thì server cần middleware tương ứng để parse.express.json()choapplication/json,express.urlencoded()choapplication/x-www-form-urlencoded. Nếu client gửi dạngmultipart/form-data(thường dùng để upload file), mấy đứa sẽ cần thư viện khác nhưmulter. - Bảo mật là trên hết: Dữ liệu từ
req.bodylà cửa ngõ tiềm năng cho các cuộc tấn công như XSS (Cross-Site Scripting) hay SQL Injection. Luôn đảm bảo dữ liệu được làm sạch kỹ lưỡng trước khi hiển thị lại cho người dùng hoặc đưa vào truy vấn database.
Ứng dụng thực tế: req.body có mặt khắp nơi
req.body được sử dụng trong hầu hết các ứng dụng web và API mà mấy đứa dùng hàng ngày:
- Đăng nhập/Đăng ký: Khi mấy đứa điền username và password vào form đăng nhập, dữ liệu đó được gửi lên server qua
req.body. - Tạo bài viết/sản phẩm: Khi mấy đứa tạo một bài post trên Facebook, đăng một sản phẩm mới trên Shopee, hoặc viết một email, toàn bộ nội dung đó đều nằm trong
req.body. - Cập nhật thông tin cá nhân: Thay đổi avatar, cập nhật địa chỉ, số điện thoại trong phần cài đặt tài khoản.
- API cho ứng dụng di động: Các app mobile gửi và nhận dữ liệu từ backend thông qua các API, và
req.bodylà cách chính để gửi dữ liệu phức tạp.
Thử nghiệm & Nên dùng cho Case nào
Anh Creyt đã từng thử không dùng middleware để xem req.body nó "trống rỗng" như thế nào rồi, và kết quả là undefined thật! Từ đó anh mới thấm thía tầm quan trọng của mấy cái app.use() này.
Vậy khi nào thì nên dùng req.body?
- Khi cần gửi dữ liệu "nặng" hoặc "nhạy cảm": Những thông tin không nên lộ trên URL.
- Khi dữ liệu có cấu trúc phức tạp: JSON object, array of objects, v.v.
- Với các phương thức HTTP
POST,PUT,PATCH: Đây là những phương thức được thiết kế để gửi dữ liệu lên server để tạo mới, cập nhật hoặc thay đổi tài nguyên.
Phân biệt nhanh:
req.query: Dữ liệu nhỏ, không nhạy cảm, dùng để lọc, tìm kiếm, phân trang (ví dụ:/products?category=electronics&page=1).req.params: Dùng để xác định tài nguyên cụ thể (ví dụ:/products/123để lấy sản phẩm có ID là 123).req.body: Dữ liệu lớn, cấu trúc phức tạp, nhạy cảm, dùng để tạo mới, cập nhật tài nguyên.
Hy vọng qua bài này, mấy đứa đã "khai sáng" được về req.body và biết cách sử dụng nó một cách hiệu quả và an toàn. Nhớ những lời anh Creyt dặn nhé: "Đừng quên middleware và đừng tin client!" Chúc mấy đứa code vui vẻ!
Thuộc Series: Nodejs
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!