In Express and Node.js, is it possible to extend or override methods of the response object?

express, javascript, node.js, oop

Solution

The best idea would be to add a custom method to the prototype of the response object:

var express = require("express");

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

And this function should be accessible by every `res` object.

You can read the source code to see how they extend native objects. Basically they are doing prototype chaining:

express/lib/response.js

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

And this object becomes a prototype of newely created response object (which comes from connect framework):

res.__proto__ = app.response;

(`app.response` is just an alias to `res` defined above). Note that `__proto__` property is a reference to the prototype of an object.

Be warned though. First of all `__proto__` is not a part of EcmaScript (it might not be available in other JavaScript implementations). Secondly: normally you would do inheritance with `Object.create` (setting `__proto__` directly on an object is a monkey patching and it is generally a bad practice, it may break many things). Read more about that here:

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

Problem

With every middleware, Express passes a `res` and a `req` objects. These objects extend the native ones that come from `http.ServerResponse` and `http.ClientRequest` respectively. I'd like to know if it's possible to override or extend methods of the response object. For example, instead of `res.render('home', jsonData);`, I'd like to extend `res` with a custom method called customRender and use it like so: `res.customRender()`. I'm not stuck at a particular problem or anything. I'd just like to learn how to extend native objects or, as with this case, object that come from 3rd party modules in Node.js

Original source