Extends Express.js with response hooks
npm install express-response-hooksExtend Express.js with response hooks, primarily aimed to manipulate the response before being sent to the client.
``sh`
npm install express-response-hooks
`js
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');
}
});
);
`
#### Options object
- plugNamestring
- Type: "hooks"
- Default:
Controls under which key the hooks event emitter will be available in the response object. Default to res.hooks
that enables registration to the following events:| Event Name | Trigger | Arguments Array | Trigger |
|--------------|------------------|---------------------------------------------|-------------|
| "statusCode" | res.statusCode | status code (int) | statusCode property is changed internally |res.set()
| "set" | | header name (string), header value (string) | set() is called internally or explicitly |res.send()
| "send" | | body (int / object / string) | send() is called internally (e.g., res.json() calls it twice) or explicitly |
For example
`js`
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
`js`
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');
}
});
For example
`js`
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);
}
});
manipulation will not work if the hook was triggered by send()`