重写 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的原始签名。它现在接受状态代码、编码类型和要发送到客户端的消息。

5jUrOR1C41jb6gvOcKirbVWLBTgORPXDfgNJscBwlKcWo5rVvQO+UfbVRfjKG4n9

res.sendStatus(404, 'application/json', '{"error":"resource not found"}')

属性

vwQ9yE1rZrtNfnGmG91oSwxP7P+BnEMYctL2INvq71s=

  1. 分配的属性(例如:req.baseUrlreq.originalUrl
  2. 定义为获取器(例如:req.securereq.ip

jd0MD8dS8iucWp8BlKRyZ8TgCB5Mg9QxDG0e5NGAih8H9vzoo4Uq1l+Y9YenQOCoREd+t7X43z5GoGmI2/H+ri1Ae7wRy3tkRmcMz+cXkkszBshwWaEU9pKrgiDE8ydYUWLimIwTwkZ0RGNRkl64peUn8v5ygw5qi4REVunUPCIDPDpzcbg2uI/v1xsjRu9hNuRQlo4tCMHdW8SCZrRaJJWBdgOzG5w16ySXpRF7FW8Bta1LlaWMBcFJpl8kGAdv

Usf8WOWYH+dQJVZ4Bz8okvR+1pfqxiYVvnNif7Arak9W1SVIiurfqr4WA/ibblQ+A+qvNbG7cXYwLuln3ywnVRWeKHYTAtIgReyNarArmjQ=

u3yVD1JM6f34ZFUUMVcmZPEm4Jh770yGp96NirCBPi+8QnKGRIs5xKdF03If4nQSoyicxH6FzQfZV/OxkdrvAD9W+hFoalE5EqlFLY3OxekMXCXY5PG8sAdcPuTXXpH+qzjvswZlO5T5dcZUZ7oVqvRTsW2ZawhhOY+6K5TORNZ4CrX7bYKRwyYbN5uhP6AK

Object.defineProperty(app.request, 'ip', {
  configurable: true,
  enumerable: true,
  get () { return this.get('Client-IP') }
})

原型

KF0nDp3NLLDcp5RhJ5Rvo7huZzZ30RIbEVvy8LHF0ATBpFhxldbC2W9VZqnENQGjwOik4QNYYj6Vsv6s0OrYspV12vSGl3o4+60qiqOaYtaefVfTt5mD8yeYtpfVjOC9E1BJisA7my3yU9058SXRKvAv07SRwCMMYGJUeX6WoLTybxsTFBhfEkhGkw30HIruWJVZI4kDGLsMesgJSmLd/HO9bHwd+yyd8k2Fk+/LrQ/byB3GIGYbtzi1I2ffsJCwabRtR+gDCnMMRYG78E4qqK+d9n1uTpQwGzoE/3FGoOdx0pYb5TNJ8voKBiW23I7SMaGGFx+yB2xIjMHtWAoYYu1LXMqYZQUttv3WeRCC2GthmVBw57Ig/Dtg0GKLAUF4

YLSU7Tvn0gI1uYEhIVzAgNJESVFZ0B1fvxsByFca7ziY062pLtsYvJFPSisvl4pZYL8zPyVAoZDztDnUOqINohgmOLZsmvgT8yGlfEmPMCLfCXtwVIi/i9SavjCJly4dk0VIq5+1OFaGnoUvVGWh2LFcPVEeHKuTsPg2mF/SXWbHhyOSLD/z3/dmD+TkJ5ybvFrj9rZ6F0r+Suy3KG28puE3IZTpeKeKCxFKqu6RKlg=

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