Editar en GitHub

Sobrescribir la API de Express

La API de Express consiste en varios métodos y propiedades en los objetos de solicitud y respuesta. Estos se heredan por prototipo. Hay dos puntos de extensión para la API de Express:

  1. Los prototipos globales en express.request y express.response.
  2. Prototipos específicos de la aplicación en app.request y app.response.

Alterar los prototipos globales afectará a todas las aplicaciones Express cargadas en el mismo proceso. Si lo deseas, las alteraciones pueden hacerse específicas de la aplicación modificando solo los prototipos específicos de la aplicación después de crear una nueva aplicación.

Métodos

Puedes sobrescribir la firma y el comportamiento de los métodos existentes con los tuyos propios, asignando una función personalizada.

A continuación se muestra un ejemplo de cómo sobrescribir el comportamiento de 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);
};

La implementación anterior cambia completamente la firma original de res.sendStatus. Ahora acepta un código de estado, un tipo de codificación y el mensaje a enviar al cliente.

El método sobrescrito ahora puede usarse de esta manera:

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

Propiedades

Las propiedades en la API de Express son:

  1. Propiedades asignadas (ej: req.baseUrl, req.originalUrl)
  2. Definidas como getters (ej: req.secure, req.ip)

Dado que las propiedades de la categoría 1 se asignan dinámicamente en los objetos request y response en el contexto del ciclo solicitud-respuesta actual, su comportamiento no puede ser sobrescrito.

Las propiedades de la categoría 2 pueden sobrescribirse usando la API de extensiones de la API de Express.

El siguiente código reescribe cómo se deriva el valor de req.ip. Ahora, simplemente devuelve el valor del header de solicitud Client-IP.

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

Prototipo

Para proporcionar la API de Express, los objetos request/response pasados a Express (vía app(req, res), por ejemplo) necesitan heredar de la misma cadena de prototipos. Por defecto, esta es http.IncomingRequest.prototype para la solicitud y http.ServerResponse.prototype para la respuesta.

A menos que sea necesario, se recomienda que esto se haga solo a nivel de la aplicación, en lugar de globalmente. Además, ten cuidado de que el prototipo que se está utilizando coincida lo más posible con la funcionalidad de los prototipos por defecto.

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