Overriding the Express API

Express API由请求和响应对象上的各种方法和属性组成. 这些是由原型继承的. Express API有两个扩展点:

  1. 位于express.requestexpress.response的全局原型.
  2. app.requestapp.response的特定于应用程序的原型.

更改全局原型会在同一过程中影响所有已加载的Express应用程序. 如果需要,可以通过在创建新应用程序后仅更改特定于应用程序的原型来进行特定于应用程序的更改.

Methods

通过分配自定义函数,可以使用自己的方法覆盖现有方法的签名和行为.

以下是重写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"}')

Properties

Express API中的属性是:

  1. 分配的属性(例如: req.baseUrlreq.originalUrl
  2. 定义为吸气剂(例如: req.securereq.ip

由于类别1下的属性是在当前请求-响应周期的上下文中动态分配给requestresponse对象的,因此不能覆盖它们的行为.

可以使用Express API扩展API覆盖类别2下的属性.

以下代码重写了如何得出req.ip的值. 现在,它仅返回Client-IP请求标头的值.

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

by  ICOPY.SITE