7. Express Framework
7.5.4 Sử dụng middleware trong express
Sử dụng middleware ở cấp ứng dụng
Khi bạn khởi tạo một ứng dụng Web với Express một đối tượng đại diện cho ứng
dụng của chúng ta đó là app (tùi theo mỗi người mà tên đối tượng này có thể sẽ
khác). Chúng ta có thể sử dụng đối tượng này để khai báo middleware thông qua các hàm app.use() hoặc app.METHOD METHOD ở đây chính là các phương thức của request .
Ví dụ với middleware khi không có đường dẫn. Với kiểu khai báo như thế này thì mỗi khi có yêu cầu tới middleware sẽ được thực thi.
File server.js
var express = require('express'); var app = express();
app.use(function(request, response, next){ console.log('Time:' + Date.now()) next();
});
app.get('/', function(request, response){
response.send('Chào mừng các bạn đến với học viện công nghệ VietPro');
});
app.listen(3000)
Ví dụ này sẽ gắn một middleware vào đường dẫn /user/:id . Middleware sẽ được
thực thi khi có một yêu cầu truy cập vào /user/:id
File server.js
var express = require('express'); var app = express();
app.use('/user/:id', function(request, response, next){ console.log('Time:' + Date.now())
next(); });
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 35 app.get('/*', function(request, response){
response.send('Chào mừng các bạn đến với học viện công nghệ VietPro');
});
app.listen(3000)
Ví dụ khi một người dùng truy cập đường dẫn bằng phương thức GET.
File server.js
var express = require('express'); var app = express();
app.get('/user/:id', function(request, response, next){
response.send('Chào mừng các bạn đến với học viện công nghệ VietPro');
});
app.listen(3000)
Khi chúng ta muốn khai báo một lúc nhiều middleware cho một đường dẫn, các bạn có thể viết liên tiếp nhiều hàm là các tham số phía sau tham số đường dẫn.
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()
})
Trong trường hợp các bạn có nhiều router được xác định cho một đường dẫn. Ví dụ
app.get('/user/:id', function (req, res, next) { console.log('ID:',req.params.id) next() },function(req,res,next){ res.send('User Info') }) app.get('/user/:id',function(req,res,next){ res.end(req.params.id)
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 36 })
Trong trường hợp trên khi một client truy cập vào /user/:id thì phía express sẽ tự
động đẩy vào User Info và không thể nào chuyển tiếp tới req.params.id . Để có thể
chuyển tiếp tới req.params.id thì ở hàm next() chúng ta phải khai báo thêm tham
số 'router' thì nó sẽ tự động chuyển về router cuối cùng trong danh sách router
Ví dụ dưới đây mô tả trường hợp khi truy cập vào đường dẫn /user/:id với id
khác 0 thì sẽ chuyển tới req.params.id
File server.js
var express = require('express'); var app = express();
app.get('/user/:id', function (req, res, next) { console.log('ID:', req.params.id)
if (req.params.id == 0) { next('router');
} else next()
}, function (req, res, next) { res.send('User Info') })
app.get('/user/:id', function (req, res, next) { res.end(req.params.id)
})
app.listen(3000)
Sử dụng middleware ở cấp Router
Các middleware của Router về cách thức hoạt động không khác gì so với middleware cấp ứng dụng. Nhưng thay vì sử dụng đối tượng đại diện cho ứng dụng, chúng ta sẽ sử dụng thể hiện của Router.
var router = express.Router()
ở trong đối tượng router cũng có những phương thức tương tự như ở trong đối
tượng app của ứng dụng. Bao gồm router.use() và router.METHOD .
Ví dụ:
File server.js
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 37 var app = express();
var router = express.Router();
router.use('/user/:id', function(request, response, next){ console.log('Time: ' + Date.now());
next(); });
router.get('/user/:id', function(request, response, next){
response.send('Chào mừng các bạn đến với học viện công nghệ VietPro');
});
app.use(router) app.listen(3000)
Sử dụng middleware xử lý lỗi
Một trong những điều quan trọng nhất trong xây dựng web là xử lý lỗi. Vì hệ thông sẽ phụ thuộc vào các dịch vụ , cơ sở dữ liệu khác, cũng như người sử dụng dịch vụ đó. Cơ sở dữ liệu không kết nối được, dịch vụ sẽ không hoạt động và người dùng sẽ không thể nào truy cập tới được các đường dẫn của chúng ta.
Để phòng chống những tính huống như vậy bạn phải xử lý các lỗi đúng cách. Trước khi đi vào ví dụ đơn giản về xử lý lỗi thì chúng ta cùng xem cú pháp khai báo một middleware xử lý lỗi trong expres.
Cú pháp
app.use(function(error, request, response, next){ })
Như các bạn thấy thì middleware xử lý lỗi thì chúng ta sẽ có thêm 1 tham số đó là error. Chính là đối tượng chứa thông báo lỗi của chúng ta.
Ví dụ thông báo lỗi đơn giản. File server.js
var express = require('express'); var app = express();
app.get('/user/:id', function(request, response, next){ if (request.params.id == 0) {
var error = {
title: "Không tìm thấy ID", httpStatusCode: 400
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 38 } return next(error); } response.end(request.params.id); });
app.use(function(error, request, response, next){
response.status(error.httpStatusCode).send(error.title) })
app.listen(3000)
Trong ví dụ trên tôi viết ra một middleware xử lý lỗi đơn giản. Ở trong router /user/:id tôi viết đoạn code đơn giản để kiểm tra tham số id bằng 0 thì tạo ra một đối tượng chứa thông tin lỗi sau đó tiến hành chuyển tiếp thông tin lỗi đến middleware xử lý lỗi để tiếp tục xử lý.
Để chạy thửví dụ các bạn chạy command với lệnh
node server
Sử dụng middleware tích hợp
Middleware tích hợp là các middleware đã được cài đặt sẵn ở trong đối tượng express.
Express có các midleware tích hợp sau:
express.static: dùng để sử dụng các tập tin tĩnh như các tập tin css, javascript hay image
express.json:phân tích các yêu cầu gửi lên bằng JSON
express.urlencode: phân tích các yêu cầu của được mã hóa theo url.
Sử dụng middleware của bên thứ ba
Ngoài những middleware các bạn tự xây dụng hay các middleware tích hợp sẵn
các bạn có thể cài các middleware của các bên thứ 3 ở trên kho NPM.