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
-
plugName
- Type:
string
- Default:
"hooks"
Controls under which key the hooks event emitter will be available in the response object. Default to
res.hooks
- Type:
res.hooks
The hooks EventEmitter
that enables registration to the following events:
Event Name | Trigger | Arguments Array | Trigger |
---|---|---|---|
"statusCode" | res.statusCode |
status 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
- You should take into consideration that Express internally calls some of the response functions right before the response gets sent to the client (e.g., adding default headers)
-
statusCode
manipulation will not work if the hook was triggered bysend()