Một server Express tối giản
// File: app.js
const express = require('express');
const app = express();
app.use(express.json()); // đọc body JSON của request
app.get('/health', (req, res) => {
res.json({ status: 'ok' });
});
app.listen(3000, () => {
console.log('Server chạy tại :3000');
});
Mỗi route khai báo một phương thức HTTP + đường dẫn. Callback nhận req (thông tin request) và res (cách trả lời). Đây là mô hình bạn sẽ gặp lại ở mọi framework khác.
Middleware: lớp áo của request
Middleware là hàm chạy giữa lúc request tới và lúc route xử lý. Nó có thể log, xác thực, đọc body… Express cho phép xếp nhiều middleware chạy tuần tự.
// File: middleware.js
// Middleware log: mỗi request in ra một dòng
app.use((req, res, next) => {
console.log(`${req.method} ${req.url} - ${Date.now()}`);
next(); // chuyển request tiếp cho middleware/route sau
});
// Middleware bảo vệ: từ chối nếu chưa đăng nhập
function requireAuth(req, res, next) {
if (!req.headers.authorization) {
return res.status(401).json({ error: 'Chưa đăng nhập' });
}
next();
}
app.get('/me', requireAuth, (req, res) => {
res.json({ user: 'Minh' });
});
Nếu middleware không gọi next(), request bị “kẹt” và không bao giờ tới được route. Luôn kết thúc middleware bằng next() hoặc trả response.
Route với tham số động
// File: routes.js
// :id là tham số trong đường dẫn
app.get('/api/courses/:id', (req, res) => {
const { id } = req.params;
const course = courses.find((c) => c.id === id);
if (!course) {
return res.status(404).json({ error: 'Không thấy khoá học' });
}
res.json(course);
});
// Dữ liệu người dùng gửi lên nằm trong req.body
app.post('/api/courses', (req, res) => {
const { title, price } = req.body;
if (!title) return res.status(400).json({ error: 'Thiếu title' });
const created = { id: String(Date.now()), title, price };
courses.push(created);
res.status(201).json(created);
});
Cấu trúc thư mục nên có
Đừng nhét hết vào app.js. Tách route, controller, model rõ ràng để code lớn lên không thành mớ hỗn độn.
// File: structure.txt
src/
├── app.js # khởi tạo express, gắn middleware
├── server.js # lắng nghe cổng
├── routes/ # định nghĩa đường dẫn (courses.js, auth.js)
├── controllers/ # logic xử lý từng request
├── models/ # thao tác dữ liệu (DB)
└── middlewares/ # auth, error, validate
❓ Một middleware không gọi `next()` và cũng không trả response. Chuyện gì xảy ra với request đó?
- Dựng được server Express chạy được
- Viết route GET/POST có tham số
- Hiểu chuỗi middleware và next()
- Tách thư mục routes/controllers/models