How to Override the Express API - [Express Tutorial - Part 4/10] 😊 (Series: Bí kíp Javascript - PHẦN 26)
Overriding the Express API
Express API bao gồm các hàm và Properties khác nhau trên các đối tượng request
và response
. Chúng được kế thừa từ prototype
. Có hai điểm cơ bản mà chúng ta có thể mở rộng cho API Express
:
- Các
prototype global
tạiexpress.request
vàexpress.response
. Prototype
dành riêng choapp
tạiapp.request
vàapp.response
.
Việc thay đổi các prototype
chung sẽ ảnh hưởng đến tất cả các ứng dụng Express
đã load
trong cùng một quy trình. Nếu muốn, có thể thực hiện các thay đổi dành riêng cho ứng dụng bằng cách chỉ thay đổi các prototype
dành riêng cho ứng dụng sau khi tạo ứng dụng mới.
Methods
Bạn có thể ghi đè chữ ký và hành vi của các hàm hiện có bằng của riêng bạn, bằng cách gán một hàm tùy chỉnh.
Sau đây là một ví dụ về ghi đè hành vi của res.sendStatus.
app.response.sendStatus = function (statusCode, type, message) {
// code is intentionally kept simple for demonstration purpose
return this.contentType(type)
.status(statusCode)
.send(message)
}
Việc thực hiện trên làm thay đổi hoàn toàn signature
ban đầu của res.sendStatus
. Bây giờ nó chấp nhận một status code
, encoding type
và message
sẽ được gửi đến client
.
Hàm ghi đè hiện có thể được sử dụng theo cách này:
res.sendStatus(404, 'application/json', '{"error":"resource not found"}')
Properties
Các Properties
trong API Express
là:
Properties
được chỉ định (ví dụ:req.baseUrl
,req.originalUrl
)- Được định nghĩa là
getters
(ví dụ:req.secure
,req.ip
)
Vì các Properties
trong mục 1 được gán động (dynamically
) trên các đối tượng request
và response
trong contexts
của chu kỳ response-request
hiện tại, nên không thể ghi đè hành vi của chúng.
Các Properties
trong mục 2 có thể được ghi đè bằng cách sử dụng Express API extensions API
.
Đoạn code sau đây viết lại cách value của req.ip
được dẫn xuất (derived
). Bây giờ, nó chỉ đơn giản trả về value
Client-IP
của headers request
.
Object.defineProperty(app.request, 'ip', {
configurable: true,
enumerable: true,
get () { return this.get('Client-IP') }
})
Prototype
Để tạo ra API Express.js
, thì người ta đã tạo ra các request/response
được truyền đến Express.js
(ví dụ: thông qua app(req, res)
) cần phải kế thừa từ cùng một chuỗi prototype
. Theo mặc định sẽ là http.IncomingRequest.prototype
dành cho request
và http.ServerResponse.prototype
dành cho response
.
Trừ khi cần thiết, chúng ta khuyến nghị rằng điều này chỉ được thực hiện ở cấp ứng dụng (app
), thay vì trên global
.
// Use FakeRequest and FakeResponse in place of http.IncomingRequest and http.ServerResponse for the given app reference
Object.setPrototypeOf(Object.getPrototypeOf(app.request), FakeRequest.prototype)
Object.setPrototypeOf(Object.getPrototypeOf(app.response), FakeResponse.prototype)
Mình hy vọng bạn thích bài viết này và học thêm được điều gì đó mới.
Donate mình một ly cafe hoặc 1 cây bút bi để mình có thêm động lực cho ra nhiều bài viết hay và chất lượng hơn trong tương lai nhé. À mà nếu bạn có bất kỳ câu hỏi nào thì đừng ngại comment hoặc liên hệ mình qua: Zalo - 0374226770 hoặc Facebook. Mình xin cảm ơn.
Momo: NGUYỄN ANH TUẤN - 0374226770
TPBank: NGUYỄN ANH TUẤN - 0374226770 (hoặc 01681423001)
All rights reserved