2013-08-18 12 views
17

Con ogni middleware, Express passa uno res e uno req oggetti. Questi oggetti estendono i nativi che provengono rispettivamente da http.ServerResponse e da http.ClientRequest. Mi piacerebbe sapere se è possibile sovrascrivere o estendere i metodi dell'oggetto risposta.In Express e Node.js, è possibile estendere o sovrascrivere i metodi dell'oggetto risposta?

Ad esempio, anziché res.render('home', jsonData);, desidero estendere res con un metodo personalizzato denominato customRender e utilizzarlo in questo modo: res.customRender().

Non sono bloccato a un problema particolare o altro. Mi piacerebbe solo imparare come estendere oggetti nativi o, come in questo caso, oggetto che proviene da moduli di terze parti in Node.js

risposta

28

L'idea migliore sarebbe quella di aggiungere un metodo personalizzato per il prototipo dell'oggetto risposta:

var express = require("express"); 

express.response.customRender = function() { 
    // your stuff goes here 
}; 

E questa funzione dovrebbe essere accessibile da ogni oggetto res.

È possibile leggere il codice sorgente per vedere come estendono gli oggetti nativi. In pratica stanno facendo a catena di prototipi:

espressi/lib/response.js

var res = module.exports = { 
    __proto__: http.ServerResponse.prototype 
}; 

E questo oggetto diventa un prototipo di oggetto risposta newely creato (che viene dal quadro connect):

res.__proto__ = app.response; 

(app.response è solo un alias per res definito in precedenza). Si noti che la proprietà __proto__ è un riferimento al prototipo di un oggetto.

Attenzione però. Prima di tutto __proto__ non fa parte di EcmaScript (potrebbe non essere disponibile in altre implementazioni JavaScript). In secondo luogo: normalmente si farebbe l'ereditarietà con Object.create (l'impostazione di __proto__ direttamente su un oggetto è una patch di scimmia ed è generalmente una cattiva pratica, potrebbe spezzare molte cose). Maggiori informazioni al riguardo:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

+0

questo non funziona. dall'interno del callable il contesto 'questa 'sarà la funzione esportata al posto dell'oggetto' response'. – r3wt

+0

È anche possibile estendere l'istanza espressa costruita nello stesso modo (anziché il costruttore express). ad es. var app = express(); app.response.foo = function() {console.log ('foo');} – Porlune

9

Basta aggiungere un middleware che aggiunge la funzione customRender a res.

function(req, res, next) { 
    res.customRender = function() { 
    // implement your custom renderer 
    } 
    next(); 
} 
+0

Freddo. Grazie! Sai come Express estende la funzionalità delle classi native http? –

+11

Questo creerà una nuova funzione per ogni risposta, tuttavia, è meglio usare 'util.inherits' e aggiungerlo una volta al prototipo. –

+2

Oppure assegnare la funzione alla variabile e assegnare res.customRenger = fn; (o avvolgere la chiamata se avete bisogno di req, res, successiva) – JakubKnejzlik

Problemi correlati