MIDDLEWARE trong EXPRESS


Middleware là phần mềm máy tính với nhiệm vụ kết nối các phần mềm hoặc các ứng dụng với nhau.
                                              
Express là một web framework định hướng và là phần trung gian với tính năng cơ bản nhất của nó.
Phần trung gian (middleware- tôi tạm dịch như vậy) là một tính năng với các truy cập đến các đối tượng yêu cầu (req), các đối tượng trả lời (res) và các phần trung gian tiếp theo trong vòng lặp req-res của ứng dụng.
- Middleware có thể:
-          - Thực thi một đoạn code
-          - Thay đồi những đối tượng req và res
-         -  Kết thục vòng req-res.
-         -  Gọi các phần trung gian tiếp theo.

Nếu hiện tại không kết thúc phần trung gian trong vòng lặp, nó phải gọi next() để chuyển đến phần trung gian tiếp theo, nếu không thì req sẽ bị treo.
Một ứng dụng express có thể sử dụng những phần trung gian sau:
-       -    Phần trung gian mức ứng dụng.
-       -   Phần trung gian mức định tuyến
-       -   Phần trung gian điểu khiển lỗi
-         - Phần trung gian xây dựng sẵn
-         - Phần trung gian của các bên thứ 3

 Phần trung gian mức ứng dụng:
-       Kết nối phần trung gian mức ứng dụng đến một instance của một ứng dụng đối tượng với app.use() và app.METHOD() là các phương thức HTTP ,… như ví dụ dưới:
-       var app = express();
-        
-       // a middleware with no mount path; gets executed for every request to the app
-       app.use(function (req, res, next) {
-         console.log('Time:', Date.now());
-         next();
-       });
-        
-       // a middleware mounted on /user/:id; will be executed for any type of HTTP request to /user/:id
-       app.use('/user/:id', function (req, res, next) {
-         console.log('Request Type:', req.method);
-         next();
-       });
-        
-       // a route and its handler function (middleware system) which handles GET requests to /user/:id
-       app.get('/user/:id', function (req, res, next) {
-         res.send('USER');
-       });
Dưới đây là một ví dụ load 1 vài middleware tại điểm mount, và đường dẫn đến mount point đó.
// a middleware sub-stack which prints request info for any type of HTTP request to /user/:id
app.use('/user/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

 Ví dụ:
// a middleware sub-stack which handles GET requests to /user/:id
app.get('/user/:id', function (req, res, next) {
  console.log('ID:', req.params.id);
  next();
}, function (req, res, next) {
  res.send('User Info');
});
 
// handler for /user/:id which prints the user id
app.get('/user/:id', function (req, res, next) {
  res.end(req.params.id);
});
Vì dụ trên định nghĩa 2 request GET đến /user/:id . Res thứ 2 không có lỗi gì cả nhưng nó sẽ không bao giờ được gọi bởi vì định hướng kết thúc đầu tiên xảy ra trong vòng lặp.
// a middleware sub-stack which handles GET requests to /user/:id
app.get('/user/:id', function (req, res, next) {
  // if user id is 0, skip to the next route
  if (req.params.id == 0) next('route');
  // else pass the control to the next middleware in this stack
  else next(); //
}, function (req, res, next) {
  // render a regular page
  res.render('regular');
});
 
// handler for /user/:id which renders a special page
app.get('/user/:id', function (req, res, next) {
  res.render('special');
});
Phần trung gian mức định hướng.
Phần trung gian định hướng làm việc giống như phần trung gian mức ứng dụng ngoại trừ:
Var router = express.Router()
Ví dụ dưới sau :
var app = express();
var router = express.Router();
 
// a middleware with no mount path, gets executed for every request to the router
router.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});
 
// a middleware sub-stack shows request info for any type of HTTP request to /user/:id
router.use('/user/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});
 
// a middleware sub-stack which handles GET requests to /user/:id
router.get('/user/:id', function (req, res, next) {
  // if user id is 0, skip to the next router
  if (req.params.id == 0) next('route');
  // else pass the control to the next middleware in this stack
  else next(); //
}, function (req, res, next) {
  // render a regular page
  res.render('regular');
});
 
// handler for /user/:id which renders a special page
router.get('/user/:id', function (req, res, next) {
  console.log(req.params.id);
  res.render('special');
});
 
// mount the router on the app
app.use('/', router);
Phần trung gian điều khiển lỗi:
app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});
Phần này có 4 agurments thay vì 3 như các middleware khác.
Phần trung gian xây dựng sẵn:
Ví dụ:
var options = {
  dotfiles: 'ignore',
  etag: false,
  extensions: ['htm', 'html'],
  index: false,
  maxAge: '1d',
  redirect: false,
  setHeaders: function (res, path, stat) {
    res.set('x-timestamp', Date.now());
  }
}
 
app.use(express.static('public', options));
 bạn có thể có nhiều hơn 1 thư mục tĩnh cho 1 app của bạn:
app.use(express.static('public'));
app.use(express.static('uploads'));
app.use(express.static('files'));
Phần trung gian của party thứ 3.
Ví dụ:
$npm install cookie-parser

var app = express();
var cookieParser = require('cookie-parser');
 
// load the cookie parsing middleware
app.use(cookieParser());



Nhận xét

Bài đăng phổ biến từ blog này

Trang web medium.com chết, vì sao ?

Cách sử dụng sys.argv trong python.

Thiết kế một RESTful API bằng python và flask.