app.use(): Cánh Cửa Vạn Năng Của Express.js
Nodejs

app.use(): Cánh Cửa Vạn Năng Của Express.js

Author

Admin System

@root

Ngày xuất bản

22 Mar, 2026

Lượt xem

1 Lượt

"app.use()"

Chào mấy đứa, hôm nay anh Creyt sẽ giải mã một trong những "phép thuật" cơ bản nhưng cực kỳ quyền năng trong thế giới Node.js và Express.js: thằng app.use(). Nghe tên thì có vẻ đơn giản, nhưng nó chính là trái tim, là bộ não giúp ứng dụng của mấy đứa hoạt động mượt mà, ngăn nắp và "ngầu" hơn rất nhiều đấy.

app.use(): Cánh Cửa Vạn Năng Của Express.js

Mấy đứa cứ hình dung thế này, cái ứng dụng Express.js của mình nó giống như một nhà hàng 5 sao vậy. Khi một khách hàng (client) bước vào, họ đâu có đi thẳng vào bếp để lấy đồ ăn đâu, đúng không? Họ phải đi qua một chuỗi các "cửa kiểm soát":

  1. Cửa đón tiếp: "Chào mừng quý khách, đây là nhà hàng X. Mời quý khách để áo khoác ở đây." (Đây có thể là middleware kiểm tra CORS, log lại request).
  2. Cửa soát vé/kiểm tra đặt bàn: "Quý khách đã đặt bàn chưa ạ? Tên là gì ạ?" (Đây là middleware xác thực người dùng - authentication).
  3. Cửa hướng dẫn: "Mời quý khách đi lối này để đến khu vực bàn của mình." (Đây là middleware xử lý static files, hoặc các route chính).
  4. Cửa phục vụ: "Vâng, món ăn của quý khách đây ạ!" (Đây mới là cái route handler cuối cùng xử lý request cụ thể).

Thằng app.use() chính là cái "người gác cửa" hay "quản lý luồng" giúp mấy đứa cài đặt tất cả những "cửa kiểm soát" đó vào ứng dụng của mình. Nó cho phép mấy đứa chèn các hàm middleware vào chuỗi xử lý request của Express.

Vậy middleware là gì? Đơn giản là một hàm JavaScript có 3 tham số: req (request), res (response) và next.

  • req: Chứa thông tin về yêu cầu từ client.
  • res: Chứa các phương thức để gửi phản hồi về client.
  • next: Đây là "chìa khóa" thần kỳ. Gọi next() tức là mấy đứa đang bảo Express: "Ok, tôi đã xử lý xong phần việc của mình rồi, giờ chuyển sang middleware tiếp theo trong chuỗi đi!". Nếu không gọi next(), request sẽ bị "kẹt" lại ở middleware đó và không bao giờ đến được route handler cuối cùng.

app.use() có thể nhận vào:

  • Một hàm middleware đơn lẻ.
  • Một mảng các hàm middleware.
  • Một path (đường dẫn) tùy chọn, để chỉ áp dụng middleware cho các request có đường dẫn bắt đầu bằng path đó.
  • Một Router của Express, giúp mấy đứa tổ chức code gọn gàng hơn.

Code Ví Dụ Minh Hoạ "Tận Mắt Thấy, Tay Sờ"

Nghe lý thuyết nhiều cũng chán, giờ mình "nhúng tay" vào code để thấy rõ sức mạnh của nó nha mấy đứa.

Đầu tiên, mấy đứa cần cài Express: npm i express.

const express = require('express');
const app = express();
const port = 3000;

// Middleware 1: Logger - "Người ghi nhật ký"
// Mọi request đều phải đi qua đây để ghi lại thời gian
app.use((req, res, next) => {
  console.log(`[${new Date().toISOString()}] Request đến: ${req.method} ${req.url}`);
  next(); // Đừng quên gọi next() để chuyển quyền cho middleware tiếp theo
});

// Middleware 2: Authentication (đơn giản thôi nhé) - "Kiểm tra vé"
// Chỉ cho phép request có header 'X-Auth-Token' = 'creyt-secret' đi qua
app.use('/admin', (req, res, next) => { // Áp dụng cho mọi path bắt đầu bằng /admin
  const authToken = req.headers['x-auth-token'];
  if (authToken === 'creyt-secret') {
    console.log('Xác thực thành công cho /admin!');
    next();
  } else {
    console.log('Xác thực thất bại cho /admin!');
    res.status(401).send('Unauthorized - Thiếu vé hoặc vé giả rồi!');
  }
});

// Middleware 3: Static Files - "Kho lưu trữ tài liệu"
// Giúp server các file tĩnh như CSS, JS, hình ảnh từ thư mục 'public'
// Để thử nghiệm, hãy tạo một thư mục 'public' và đặt một file 'index.html' vào đó.
// Ví dụ: public/index.html có nội dung <h1>Hello từ file tĩnh!</h1>
app.use(express.static('public')); 

// Route handler cuối cùng - "Phục vụ món ăn"
app.get('/', (req, res) => {
  res.send('Chào mừng đến với nhà hàng của Creyt!');
});

app.get('/admin/dashboard', (req, res) => {
  res.send('Đây là trang quản trị - Chỉ người có "vé" mới vào được!');
});

app.get('/api/data', (req, res) => {
    res.json({ message: 'Đây là dữ liệu công khai.' });
});

// Khởi động server
app.listen(port, () => {
  console.log(`Server đang chạy ở http://localhost:${port}`);
});

// Để test:
// 1. Mở trình duyệt: http://localhost:3000
// 2. Mở Postman/Insomnia:
//    - GET http://localhost:3000/admin/dashboard (sẽ bị lỗi 401)
//    - GET http://localhost:3000/admin/dashboard với header: X-Auth-Token: creyt-secret (sẽ thành công)
//    - Tạo file public/index.html và truy cập http://localhost:3000/index.html

Trong ví dụ trên, mấy đứa thấy đấy:

  • app.use((req, res, next) => { ... }): Middleware này chạy cho tất cả các request.
  • app.use('/admin', (req, res, next) => { ... }): Middleware này chỉ chạy cho các request có đường dẫn bắt đầu bằng /admin.
  • app.use(express.static('public')): Đây là một middleware "có sẵn" của Express, giúp mấy đứa dễ dàng phục vụ file tĩnh.
Illustration

Mẹo Vặt & Best Practices Từ "Lão Làng" Creyt

  1. Thứ Tự Quan Trọng "Như Mạng Sống": Giống như xếp hàng vậy, middleware nào app.use() trước thì chạy trước. Middleware xác thực phải chạy trước khi xử lý logic nghiệp vụ, đúng không? Middleware log nên để đầu tiên để ghi lại tất cả.
  2. next() Là "Chìa Khóa Vạn Năng": Đừng bao giờ quên next() nếu middleware của mấy đứa không kết thúc request (ví dụ: gửi res.send() hoặc res.json()). Quên nó là coi như "tắc đường" luôn, request sẽ bị treo.
  3. Giữ Middleware "Nhỏ Gọn và Tập Trung": Mỗi middleware chỉ nên làm một việc duy nhất thôi (Single Responsibility Principle). Một thằng lo log, một thằng lo auth, một thằng lo parse body. Đừng biến nó thành "siêu nhân" làm đủ thứ, khó debug lắm.
  4. Xử Lý Lỗi "Đẹp Đẽ": Mấy đứa có thể tạo middleware xử lý lỗi riêng bằng cách định nghĩa nó với 4 tham số: (err, req, res, next). Express sẽ tự động chuyển các lỗi (bằng cách gọi next(err)) đến middleware này. Nó nên là middleware cuối cùng trong chuỗi của mấy đứa.
    app.use((err, req, res, next) => {
      console.error(err.stack);
      res.status(500).send('Có gì đó sai sai rồi, Creyt đang sửa!');
    });
    
  5. Tổ Chức Router "Ngăn Nắp": Khi ứng dụng lớn lên, mấy đứa sẽ có cả tá route. Dùng express.Router()app.use('/api', apiRouter) để nhóm các route liên quan lại, code sẽ dễ đọc, dễ quản lý hơn nhiều.

Ứng Dụng Thực Tế - "Ai Cũng Dùng, Kể Cả Mấy Ông Lớn"

Hầu như mọi ứng dụng Node.js/Express.js "ra hồn" đều dùng app.use() một cách triệt để:

  • Netflix, Uber, Grab, Facebook (phần API): Các dịch vụ này đều có API backend viết bằng nhiều ngôn ngữ, nhưng nếu dùng Node.js, họ sẽ dùng app.use() để xử lý xác thực token, ghi log request, kiểm tra quyền truy cập (authorization), giới hạn số lượng request (rate limiting), và xử lý dữ liệu gửi lên (body parsing).
  • Các trang thương mại điện tử (Shopee, Tiki): Dùng để phục vụ các file tĩnh (CSS, JS, hình ảnh sản phẩm) cho frontend, xử lý dữ liệu giỏ hàng, xác thực người dùng khi thanh toán.
  • Bất kỳ website/ứng dụng nào có API: Đều cần app.use() để cấu hình CORS (Cross-Origin Resource Sharing) để cho phép frontend từ một domain khác có thể gọi API.

"Thử Nghiệm Rồi Mới Biết" - Khi Nào Nên Dùng app.use()?

Mấy đứa nên dùng app.use() khi muốn:

  • Ghi log mọi request: Để theo dõi hoạt động của ứng dụng, debug.
  • Xác thực người dùng: Kiểm tra token, session, cookie trước khi cho phép truy cập tài nguyên.
  • Phân tích cú pháp dữ liệu gửi lên: Chuyển đổi JSON, form data từ client thành đối tượng JavaScript dễ dùng (express.json(), express.urlencoded()).
  • Phục vụ file tĩnh: HTML, CSS, JavaScript, hình ảnh, video cho frontend.
  • Thiết lập CORS: Cho phép các domain khác truy cập API của mấy đứa.
  • Nén phản hồi: Giúp giảm kích thước dữ liệu gửi về client, tăng tốc độ tải trang (compression middleware).
  • Bảo mật: Thiết lập các HTTP headers bảo mật (helmet middleware).
  • Giới hạn request (Rate Limiting): Ngăn chặn tấn công DDoS hoặc lạm dụng API.
  • Tổ chức code theo module: Gắn các express.Router() vào các đường dẫn cụ thể.

Tóm lại, app.use() là một công cụ cực kỳ linh hoạt và mạnh mẽ. Nắm vững nó, mấy đứa sẽ có thể xây dựng những ứng dụng Node.js/Express.js không chỉ chạy được mà còn chạy mượt, bảo mật và dễ bảo trì. Giờ thì, "xắn tay áo" lên và thử nghiệm ngay đi thôi!

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é!

#tech #cyberpunk #laravel
Chỉnh sửa bài viết

Bình luận (0)

Vui lòng Đăng Nhập để Bình luận

Hỗ trợ Markdown cơ bản
Nguyễn Văn A
1 ngày trước

Tính năng này đỉnh quá ad ơi, chờ mãi mới thấy một blog Tiếng Việt có UI/UX xịn như vầy!