Middleware là cái gì mà nghe "kêu" thế?
Nếu bạn mới tập tành làm Backend với Node.js, chắc hẳn đã từng gặp cảnh mỗi khi tạo một Route (đường dẫn) mới, bạn lại phải copy-paste cả tá dòng code để kiểm tra xem User đã đăng nhập chưa, hay dữ liệu gửi lên có đúng định dạng không. Cứ thế, file code của bạn dần trở nên rối nùi như một bát canh hẹ, cực kỳ khó bảo trì.

Đừng lo, Node.js Middleware sinh ra để cứu rỗi bạn. Nói một cách bình dân, Middleware giống như những "ông bảo vệ" đứng ở các cửa khẩu. Trước khi một Request (yêu cầu) từ phía người dùng chạm được đến đích cuối cùng là Database hay xử lý logic, nó buộc phải đi qua các lớp bảo vệ này. Mỗi ông bảo vệ sẽ làm một nhiệm vụ riêng: ông thì kiểm tra vé (Authentication), ông thì ghi nhật ký (Logging), ông thì kiểm tra túi xách (Validation).
Nếu mọi thứ ổn thỏa, ông bảo vệ sẽ hô to next() để cho Request đi tiếp vào vòng trong. Còn nếu phát hiện có biến? Ông ấy sẽ chặn đứng Request ngay tại cửa và đuổi thẳng cổ bằng một thông báo lỗi. Cực kỳ gọn gàng và ngăn nắp đúng không nào?
Bản chất của Middleware trong Express.js là một hàm có quyền truy cập vào đối tượng Request (req), Response (res) và hàm next trong chu trình Request-Response của ứng dụng.
Ba lớp "giáp" phổ biến nhất cho API của bạn
Để bạn dễ hình dung, hãy xem cách chúng ta triển khai Middleware cho những tác vụ thường ngày nhé. Thay vì viết đi viết lại, chúng ta chỉ cần định nghĩa một lần và dùng ở mọi nơi.
- Kiểm tra đăng nhập (Authentication): Đây là lớp giáp quan trọng nhất. Middleware sẽ soi xem Token đính kèm trong Request có hợp lệ không. Nếu không, trả về lỗi 401 ngay lập tức.
- Ghi lại hoạt động (Logging): Bạn muốn biết ai đã truy cập vào lúc nào? Một Middleware đơn giản sẽ in ra Console mọi thông tin Request mà không cần bạn phải thêm
console.logvào từng Route. - Nén dữ liệu: Giúp Web chạy nhanh hơn bằng cách nén dữ liệu trước khi gửi về cho Client, giúp tối ưu hiệu năng không kém gì việc dùng PostgreSQL Index cho Database vậy.
Hãy nhìn thử đoạn code "sương sương" dưới đây để thấy sự lợi hại của Middleware khi xử lý lỗi tập trung nhé:
// Middleware xử lý lỗi tập trung
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Có biến rồi đại vương ơi! Đội kỹ thuật đang kiểm tra.');
});Chỉ với vài dòng, bạn đã có một cái "lưới" hứng mọi lỗi phát sinh trong ứng dụng mà không cần phải dùng try-catch ở khắp mọi nơi. Đây chính là bước đầu để xây dựng một hệ thống có tính API Security vững chắc.
Sắp xếp Middleware sao cho "chuẩn bài"?
Một điểm cực kỳ quan trọng mà nhiều bạn hay quên: Thứ tự đặt Middleware cực kỳ quan trọng! Node.js xử lý Middleware theo đúng thứ tự mà bạn khai báo trong code từ trên xuống dưới. Nếu bạn đặt Middleware xử lý lỗi lên đầu tiên, nó sẽ chẳng hứng được cái lỗi nào cả vì chưa có gì kịp xảy ra.
Thứ tự vàng thường là: Middleware cấu hình (CORS, Parser) -> Middleware bảo mật -> Các Routes chính -> Cuối cùng mới là Middleware xử lý lỗi 404 và lỗi hệ thống. Việc sắp xếp đúng không chỉ giúp code chạy chuẩn mà còn giúp bạn dễ dàng gỡ lỗi khi có vấn đề phát sinh.
Mẹo: Hãy chia nhỏ Middleware ra thành nhiều file riêng biệt trong thư mục /middlewares. Đừng nhồi nhét tất cả vào file server.js nếu bạn không muốn nó trở thành một mớ hỗn độn.
Bạn có thể tìm hiểu sâu hơn về các loại Middleware tích hợp sẵn tại tài liệu chính thức của Express. Hiểu rõ Middleware chính là chìa khóa để bạn nâng cấp từ một coder "mì ăn liền" lên một Backend Engineer thực thụ, biết cách tổ chức mã nguồn khoa học và chuyên nghiệp.
Sau khi đã dẹp loạn được Request bằng Middleware, liệu bạn có tò mò làm thế nào để đóng gói toàn bộ "đội quân" Backend này vào một chiếc container để mang đi deploy khắp nơi mà không sợ lỗi môi trường không? Hãy cùng khám phá trong bài viết tới nhé!
Ghé thăm DIA DEMY để cập nhật thêm nhiều kiến thức thực chiến về lập trình và thiết kế sản phẩm.




Vui lòng đăng nhập để bình luận.