Middleware trong expressjs là gì? Tác dụng và cách sử dụng như thế nào?
Tags: middleware, express, node
Published: 2018-08-24 01:44:52

---
title: Middleware trong expressjs là gì? Tác dụng và cách sử dụng như thế nào?
published: true
description: Middleware trong expressjs là gì? Tác dụng và cách sử dụng như thế nào?
tags: [middleware, express, nodejs]
---

- [Middleware trong ngành phần mềm nói chung là gì?](#middleware-software)
- [Middleware trong các ứng dụng website như thế nào?](#middleware-web)
- [Middleware trong expressjs](#middleware-express)

# Problem

Khi mình tìm hiểu về express cụ thể là hàm cơ bản `app.use()` thì thấy có nhắc đến định nghĩa `middleware function`
> Mounts the specified middleware function or functions at the specified path: the middleware function is executed when the base of the requested path matches path.

Suy ngẫm một lúc cũng chưa rõ và chưa nắm được bản chất nên đành tìm hiểu về thuật ngữ `middleware` vậy. Tuy mất công thật, tìm hiểu và viết thành blog nhưng lại cảm thấy sướng vl.

<h2 id="middleware-software">Middleware trong ngành phần mềm nói chung là gì?</h2>

>Middleware là phần mềm máy tính với nhiệm vụ kết nối các thành phần phần mềm hoặc các ứng dụng với nhau. Phần mềm loại này bao gồm một tập các dịch vụ cho phép sự tương tác giữa các tiến trình chạy trên một hoặc nhiều máy khác nhau. Công nghệ middleware đã được phát triển để cung cấp khả năng hoạt động tương hỗ, phục vụ cho các kiến trúc phân tán thường được để hỗ trợ và đơn giản hóa các ứng dụng phân tán phức tạp.
![middleware software](https://thepracticaldev.s3.amazonaws.com/i/7i7b1708r7wwe2tnum1g.png)

- Middleware là software nằm giữa hệ điều hành và các ứng dụng chạy trên OS đó. Nhằm mục đích quản lý data và sự giao tiếp của các distributed apps
>Distributed apps là các ứng dụng hay phần mềm mà chạy trên multiple computers nhưng trong cùng 1 hệ thống network. Không giống như các apps truyền thống chỉ chạy trên 1 hệ thống đơn (single system), thì các distributed apps chạy trên multi systems 1 cách đồng thời 1 task hoặc 1 job nào đó. 

- Có thể tưởng tượng middleware giống như các ống nước vậy. Các ống nước này sẽ là nơi kết nối giữa các cáp lại với nhau, nhận đầu vào từ nơi này và chuyển nước đến đầu ra mong muốn.
Nói một cách development thì nó sẽ connect 2 ứng dụng lại với nhau vì thế data hoặc database có thể trao đổi dễ dàng qua các ống nước này.
![pipe](https://images.unsplash.com/photo-1523552322653-4ca2658acbb0?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=416bc1a26c48e9928a428a2e1f95d86c&auto=format&fit=crop&w=1351&q=80)

<h2 id="middleware-web">Middleware trong các ứng dụng website như thế nào?</h2>

- Nó là cầu nối giữa database và application
- Xử lý request và quyết định các response trả về thế nào
- Cũng có thể là cầu nối giữa các components
- Cũng có thể control application sẽ như thế nào nếu có lỗi 
- Là software component được nhúng vào ứng dụng để xử lý request và response của các user actions 

<h2 id="middleware-express">Middleware trong expressjs</h2>

>Express is a routing and <strong>middleware web framework</strong> that has minimal functionality of its own: An Express application is essentially a series of middleware function calls

Vì bản chất nó thế nên khi làm việc với express chúng ta thường xuyên sử dụng một loạt của middleware functions.

Middleware trong expressjs là:
- Một loạt các functions được gọi bởi router layer trước khi request cuối cùng được thực thi 
- Function nhận các request, response của 1 chu kỳ HTTP request/response 
- Function có thể chình sửa request, response trước khi gửi chúng đến `next` middleware function 
- Có thể update response hoặc chấm dứt nếu cần thiết
- Function nhận vào ba tham số: đối tượng [request](https://expressjs.com/en/4x/api.html#req), đối tượng [response](https://expressjs.com/en/4x/api.html#res) và `next` function
Ví dụ:
```javascript
function logger(req,res,next){
  console.log(new Date(), req.method, req.url);
  next();
}
```
![middle component](https://thepracticaldev.s3.amazonaws.com/i/vs9wjgjvrq9drwnn94kk.png)

### Tác dụng 

- Middleware function được dùng để làm các việc sau:
    - Thực thi bất kỳ đoạn code nào 
    - Update request, response 
    - Làm kết thúc chu kỳ request-response. Ví dụ có 1 vài exception xảy ra thì thay vì gọi hàm `next` thì mình có thể kết thúc nó luôn

- Express application có thể sử dụng các loại middleware sau
    - [Application-level middleware](https://expressjs.com/en/guide/using-middleware.html#middleware.application)
Bind application-level middleware thành instance của [app object](https://expressjs.com/en/4x/api.html#app) thành việc có thể sử dụng bằng `app.use()` và `app.METHOD()`
    - [Router-level middleware](https://expressjs.com/en/guide/using-middleware.html#middleware.router)
Cách thức hoạt động giống như `application-level-middleware`, ngoại trừ nó bị ràng buộc bởi instance `express.Router()`
    - [Error-handling middleware](https://expressjs.com/en/guide/using-middleware.html#middleware.error-handling)
Tên gọi nói lên tất cả
    - [Built-in middleware](https://expressjs.com/en/guide/using-middleware.html#middleware.built-in)
    - [Third-party middleware](https://expressjs.com/en/guide/using-middleware.html#middleware.third-party)
```javascript
var express = require('express')
var app = express()
var cookieParser = require('cookie-parser') // lib bên thứ ba

// load the cookie-parsing middleware
app.use(cookieParser())
```

### Ví dụ về cách sử dụng đơn giản

- Bài toán: tạo ra middleware dùng để in current time và lưu 1 cuốn sách vào database và render message
- Bài giải:

1/ Tạo method cho logging current time

```javascript
    //create a method to
    var requestTime = function (req, res, next) {
      req.requestTime = Date.now();
      console.log("Current Time for Request"+req.requestTime );
      next()
    };
```

2/ Sử dụng middleware function trên như là application-level middleware

```javascript
//use the middleware as an application-level middleware
app.use(requestTime);
```

3/ Tạo middleware để kết nối vào DB 

```javascript
// method to conenct to be

var conencttodb = function(req, res, next){
  try
  {
    var path= 'mongodb://localhost:27017/library';
    connect = mongoose.connect(path);
    console.log('conencted to db!!');
    //mongoose.set('debug', true);
  }
  catch(e)
  {
    console.log(e);
  }
};
app.use(conencttodb)
```

4/ Lưu thông tin cuốn sách bằng việc sử dụng `next` function
```javascript
// create a new book
var book = new Book({
  title: 'Peter Quill',
  author: 'starlord55',
  yearpubished: 2011,
  id: 101,
  pages:56,
  ratings:1
});

// save the book in database
book.save(function(err, req, res) {
  console.log(req.body);
  if(err) {
    console.log(err);
    res.send({
      message :'something went wrong'
    });
  } else {
    // res.contentType('application/json');
    res.send({
      message:'the book has bees saved at'+req.requestTime
    });
  }
});
```


## WHAT TO DO NEXT

Tiếp tục vọc node js =))