English

Tìm hiểu nhanh về Middleware, Model và Controller trong ExpressJs

8614cc9081fcc9aba4d07dd8ff581068.jpg

Tác giả

Trần Quốc Thịnh

28/04/2023

Chia sẻ

expressjs.png

Middleware 

   Có thể hiểu đơn giản middleware là một hàm đóng vai trò trung gian giữa các request và respone trong Middleware(cho những ai chưa biết thì request có thể hiểu nhanh là thông tin gửi từ client lên server, respone là dữ liệu server trả về cho client). Khi một request được gửi đến server, nó sẽ đi qua một loạt các Middleware trước khi đến tay Controller. Các Middleware sẽ thực hiện các công việc như:

  1. Kiểm tra quyền truy cập của người dùng
  2. Xác thực người dùng
  3. Thực hiện phân tích dữ liệu được gửi từ client
  4. Thực hiện các nhiệm vụ liên quan đến bảo mật

   Các Middleware được sử dụng để giải quyết các vấn đề chung trong các ứng dụng web và giúp phát triển ứng dụng nhanh hơn. Chúng ta có thể sử dụng các Middleware được cung cấp bởi ExpressJs hoặc ta có thể tự custom các Middleware riêng tùy vào những mục đích khác nhau. Một ví dụ đơn giản về Middleware cho các bạn dễ hình dung.

// Middleware kiểm tra quyền truy cập của người dùng
const authMiddleware = (req, res, next) => {
  // Kiểm tra xem người dùng đã đăng nhập hay chưa
  if (req.user) {
    next(); //Hàm next() này giúp các bạn có thể tiếp tục chạy các dòng lệnh bên dưới
  } else {
    res.status(401).send('Bạn cần phải đăng nhập để truy cập vào trang này.');
  }
};

// Route chỉ có thể truy cập khi đã đăng nhập
app.get('/home', authMiddleware, (req, res) => {
  res.send('Chào mừng đến với trang cá nhân của bạn!');
});

   Ở đây, authMiddleware là một Middleware kiểm tra xem người dùng đã đăng nhập hay chưa. Nếu người dùng đã đăng nhập thành công, Middleware sẽ gọi hàm next() để cho request tiếp tục đi đến Controller, ngược lại nó sẽ trả về một lỗi 401(Unauthorized).

Model

   Với những ai đã từng nghe hoặc đã từng làm việc với mô hình MVC, chắc hẳn đã không còn xa lạ gì với khái niệm Model(cho những ai chưa biết thì mô hình MVC được viết tắt bởi ba từ là Model-View-Controller). Model đóng vai trò quan trọng trong việc quản lý dữ liệu trong ứng dụng web. Trong ExpressJs, Model có thể được sử dụng để thực hiện các nhiệm vụ như truy vấn cơ sở dữ liệu, thêm xóa sửa dữ liệu trong database và định nghĩa các quan hệ giữa các đối tượng trong ứng dụng. Một ví dụ đơn giản cho việc sử dụng Model để quản lý các thông tin về tài khoản người dùng trong ứng dụng web.

// Định nghĩa Model cho tài khoản người dùng
const User = mongoose.model('User', {
  name: String,
  email: String,
  password: String
});

// Thêm mới tài khoản người dùng
const user = new User({
  name: 'Thịnh',
  email: 'thinh123@gmail.com',
  password: 'thinh123456'
});
user.save();

// Truy vấn tài khoản người dùng
User.findOne({ email: 'thinh123@gmail.com' }, (err, user) => {
  if (err) {
    console.log(err);
  } else {
    console.log(user);
  }
});

   Ở đây chúng ta sử dụng Mongoose để định nghĩa Model cho tài khoản người dùng và sử dụng Model để thêm mới và truy vấn tài khoản người dùng. Model giúp chúng ta quản lý dữ liệu một cách dễ dàng và hiệu quả hơn trong ứng dụng web.

Controller

   Cũng giống như Model, Controller là một trong ba thành phẩn logic chính của mô hình MVC. Controller trong ExpressJs chính là thành phần quản lý logic. Khi một request đã đi qua Middleware, nó sẽ được chuyển đến Controller để xử lý. Controller có thể thực hiện các nhiệm vụ như lấy dữ liệu từ Model, xử lý dữ liệu và trả về respone cho client. Dưới đây là một ví dụ về việc sử dụng Controller để lấy danh sách tài khoản người dùng từ Model và trả về respone cho client.

// Controller lấy danh sách tài khoản người dùng
const getUserList = (req, res) => {
  User.find({}, (err, users) => {
    if (err) {
      console.log(err);
    } else {
      res.send(users);
    }
  });
};

// Route để lấy danh sách tài khoản người dùng
app.get('/users', getUserList);

   Hàm getUserList ở đây là một Controller được sử dụng để lấy danh sách tài khoản người dùng tự Model và trả về respone cho client. Controller sử dụng hàm find() của Model để lấy danh sách tài khoản người dùng và sử dụng res.send() để trả về danh sách này cho client. Để kiểm tra danh sách người dùng, ta truy cập vào địa chỉ localhost của dự án(ví dụ như http://localhost:3000/users).

Kết luận

   Middleware, Model và Controller là ba thành phần quan trọng trong kiến trúc của một ứng dụng web. Middleware được sử dụng để giải quyết các vấn đề chung trong các ứng dụng web và giúp phát triển ứng dụng nhanh hơn. Model giúp chúng ta quản lý dữ liệu trong ứng dụng một cách dễ dàng và hiệu quả, trong khi Controller là thành phần quản lý logic. Các thành phần tương tác với nhau để xây dựng một ứng dụng hoàn chỉnh. Middleware có thể được sử dụng để kiểm tra và xử lý dữ liệu đầu vào từ client, sau đó gọi đến Controller để thực hiệ các tác vụ xử lý logic. Controller sử dụng Model để truy xuất và quản lý dữ liệu, sau đó trả về kết quả cho client thông qua Middleware. 

   Việc hiểu và sử dụng Middlware, Model và Controller là rất quan trọng trong việc phát triển ứng dụng web với ExpressJs. Khi hiểu rõ vai trò và nhiệm vụ của từng thành phần, chúng ta có thể dễ dàng xâu dựng ứng dụng và bảo trì dự án một cách hiệu quả và dễ dàng.

Một số lưu ý khi sử dụng Middleware, Model và Controller

  • Middleware có thể được sử dụng để xử lý các vấn đề chung trong ứng dụng web như xác thực, quản lý phiên và xử lý lỗi.
  • Model là thành phần quản lý dữ liệu trong ứng dụng web và giúp chúng ta quản lý dữ liệu một cách dễ dàng và hiệu quả hơn.
  • Controller là thành phần quản lý logic trong ExpressJs và được sử dụng để xử lý các yêu cầu từ client và trả về respone.

   Khi sử dụng Middleware, Model và Controller, chúng ta nên chú ý đến việc giữ cho code của chúng ta đơn giản và dễ đọc. Việc kết hợp các thư viện và công cụ phù hợp cũng giúp cho chúng ta phát triển và bảo trì ứng dụng một cách hiệu quả.

   Trên đây là một số chia sẽ nho nhỏ về Middleware, Model và Controller trong ExpressJs. Kiến thức trên được mình tổng hợp lại thông qua quá trình học tập và làm việc, vì vậy cho nên có thể có những thiếu sót. Nếu các bạn có thắc mắc gì về ba khái niệm trên thì có thể để lại bình luận bên dưới, mình sẽ cố gắng giải đáp thắc mắc cho các bạn trong phạm vi hiểu biết của mình. See you again <3.

Chia sẻ

Liên hệ