DEV Community

Talan
Talan

Posted on

Middleware trong expressjs là gì? Tác dụng và cách sử dụng như thế nào?

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.

Middleware trong ngành phần mềm nói chung là gì?

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

  • 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

Middleware trong các ứng dụng website như thế nào?

  • 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

Middleware trong expressjs

Express is a routing and middleware web framework 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, đối tượng responsenext 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())


Enter fullscreen mode Exit fullscreen mode

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



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


Enter fullscreen mode Exit fullscreen mode

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



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


Enter fullscreen mode Exit fullscreen mode

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



// 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)


Enter fullscreen mode Exit fullscreen mode

4/ Lưu thông tin cuốn sách bằng việc sử dụng next function



// 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
});
}
});

Enter fullscreen mode Exit fullscreen mode




WHAT TO DO NEXT

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

Top comments (2)

Collapse
 
nhatcapdang profile image
Nhatcapdang

ông viết tâm huyết quá<3

Collapse
 
namphandev profile image
Nam Phan

Your articile is absolutely clear and understanding,Hope you write more article about nodejs topics,Thank bro a lot