Home

Awesome

Express Response Hooks

Extend Express.js with response hooks, primarily aimed to manipulate the response before being sent to the client.

Installation

npm install express-response-hooks

Usage

const responseHooks = require('express-response-hooks');

// response hooks initialization
app.use(responseHooks());

// register a middleware that adds a "Cache-Control" header whenever the status code changes
app.use(function (req, res, next) {
    // hook on "statusCode" changes
    res.hooks.on('statusCode', ([ statusCode ]) => {
        if (req.method.toUpperCase() === 'GET') && (statusCode < 400)) {
            res.set('Cache-Control', 'public, max-age=5, s-maxage=31536000');
        }
    });
);

API

require('express-response-hooks')([options])

Creates a middleware that adds hooks to the response object

Options object

res.hooks

The hooks EventEmitter that enables registration to the following events:

Event NameTriggerArguments ArrayTrigger
"statusCode"res.statusCodestatus code (int)statusCode property is changed internally
"set"res.set()header name (string), header value (string)set() is called internally or explicitly
"send"res.send()body (int / object / string)send() is called internally (e.g., res.json() calls it twice) or explicitly

For example

res.hooks.once('statusCode', ([ statusCode ]) => {
  // called once when the res.statusCode is changed for the first time
});
res.hooks.on('res', ([ name, value ]) => {
  // called whenever res.res() is called internally by express to set default headers or explicitly
});

Data manipulation

Changing the values in the arguments array will change the arguments passed to the original wrapped property/function

For example

res.hooks.on('res', (args) => {
  const [ name, value ] = args;
  if (name === 'cache-control') {
    // change the value of the header
    args[1] = args[1].replace('public', 'private');
  }
});

res.hooks.bypass

An object with references to the wrapped properties and functions for using them without triggering an event.

For example

res.hooks.on('set', ([ name, value ]) => {
  if (name === 'cache-control') {
    // add additional header without triggering another 'set' event
    res.hooks.bypass.set('cdn-cache-control', value);
  }
});

Notice