Express API 包含請求和回應物件上的各種方法和屬性。這些是透過原型繼承的。Express API 有兩個延伸點
express.request
和 express.response
中的全球原型。app.request
和 app.response
中的應用程式特定原型。變更全球原型會影響在同一個處理程序中載入的所有 Express 應用程式。如果需要,可以在建立新的應用程式後,只變更應用程式特定的原型,讓變更只針對特定應用程式。
您可以透過指定自訂函數,來覆寫現有方法的簽章和行為。
以下是覆寫 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)
}
上述實作完全變更 res.sendStatus
的原始簽章。它現在接受狀態碼、編碼類型,以及要傳送給用戶端的訊息。
覆寫的方法現在可以這樣使用
res.sendStatus(404, 'application/json', '{"error":"resource not found"}')
Express API 中的屬性有下列兩種
req.baseUrl
、req.originalUrl
)req.secure
、req.ip
)由於第 1 類別的屬性是在目前要求回應週期的 request
和 response
物件上動態指派的,因此其行為無法覆寫。
第 2 類別的屬性可以使用 Express API 延伸 API 覆寫。
下列程式碼改寫如何衍生 req.ip
的值。現在,它只會傳回 Client-IP
要求標頭的值。
Object.defineProperty(app.request, 'ip', {
configurable: true,
enumerable: true,
get () { return this.get('Client-IP') }
})
為了提供 Express.js API,傳遞給 Express.js 的要求/回應物件 (例如透過 app(req, res)
) 需要從相同的原型鏈繼承。預設情況下,這是要求的 http.IncomingRequest.prototype
和回應的 http.ServerResponse.prototype
。
除非必要,否則建議只在應用程式層級執行此操作,而不是在全域執行。此外,請注意正在使用的原型與預設原型的功能性要儘可能相符。
// 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)