黑人生命也是命。
支持平等正義倡議.

覆寫 Express API

Express API 包含請求和回應物件上的各種方法和屬性。這些是透過原型繼承的。Express API 有兩個延伸點

  1. express.requestexpress.response 中的全球原型。
  2. app.requestapp.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 中的屬性有下列兩種

  1. 已指派屬性 (例如:req.baseUrlreq.originalUrl)
  2. 定義為 getter (例如:req.securereq.ip)

由於第 1 類別的屬性是在目前要求回應週期的 requestresponse 物件上動態指派的,因此其行為無法覆寫。

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