Sovrascrivendo l'API Express
L’API Express è composta da vari metodi e proprietà su richiesta e oggetti di risposta. Questi sono ereditati dal prototipo. Ci sono due punti di estensione per l’API Express:
- I prototipi globali in
express.requesteexpress.response. - prototipi specifici per app su
app.requesteapp.response.
La modifica dei prototipi globali influenzerà tutte le applicazioni Express caricate nello stesso processo. Se lo si desidera, le modifiche possono essere rese specifiche alle app modificando solo i prototipi specifici delle app dopo aver creato una nuova app.
Metodi
È possibile sovrascrivere la firma e il comportamento dei metodi esistenti con il proprio, assegnando una funzione personalizzata.
Di seguito è riportato un esempio di sovrascrittura del comportamento di 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);};L’implementazione di cui sopra cambia completamente la firma originale di res.sendStatus. Ora accetta un codice di stato, il tipo di codifica e il messaggio da inviare al client.
Il metodo overridden può ora essere utilizzato in questo modo:
res.sendStatus(404, 'application/json', '{"error":"resource not found"}');Proprietà
Le proprietà nell’API Express sono:
- Proprietà assegnate (es:
req.baseUrl,req.originalUrl) - Definito come getters (es:
req.secure,req.ip)
Poiché le proprietà sotto la categoria 1 sono assegnate dinamicamente sugli oggetti request e response nel contesto dell’attuale ciclo di richiesta-risposta, il loro comportamento non può essere superato.
Le proprietà sotto la categoria 2 possono essere sovrascritte utilizzando le API di estensione Express.
Il seguente codice riscrive come deve essere derivato il valore di req.ip. Ora restituisce semplicemente il valore dell’intestazione della richiesta Client-IP.
Object.defineProperty(app.request, 'ip', { configurable: true, enumerable: true, get() { return this.get('Client-IP'); },});Protototipo
Al fine di fornire l’API Express, gli oggetti richiesta/risposta passati a Express (tramite app(req, res), per esempio) bisogno di ereditare dalla stessa catena prototipo. Per impostazione predefinita, questo è http.IncomingRequest.prototype per la richiesta e http.ServerResponse.prototype per la risposta.
Se non necessario, si raccomanda che ciò avvenga solo a livello di applicazione e non a livello globale. Inoltre, fare in modo che il prototipo che viene utilizzato corrisponda la funzionalità il più vicino possibile ai prototipi predefiniti.
// Use FakeRequest and FakeResponse in place of http.IncomingRequest and http.ServerResponse// for the given app referenceObject.setPrototypeOf(Object.getPrototypeOf(app.request), FakeRequest.prototype);Object.setPrototypeOf(Object.getPrototypeOf(app.response), FakeResponse.prototype);