Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/arikw/express-response-hooks
Extends Express.js with response hooks
https://github.com/arikw/express-response-hooks
express express-js express-middleware expressjs
Last synced: about 2 months ago
JSON representation
Extends Express.js with response hooks
- Host: GitHub
- URL: https://github.com/arikw/express-response-hooks
- Owner: arikw
- License: mit
- Created: 2022-07-06T09:02:51.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2022-07-07T06:00:26.000Z (over 2 years ago)
- Last Synced: 2024-04-26T03:44:35.706Z (7 months ago)
- Topics: express, express-js, express-middleware, expressjs
- Language: JavaScript
- Homepage: https://www.npmjs.com/package/express-response-hooks
- Size: 18.6 KB
- Stars: 4
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-express - express-response-hooks - Intercept and mutate responses before they are sent to the client (Middleware)
README
# Express Response Hooks
Extend [Express.js](https://expressjs.com/) with response hooks, primarily aimed to manipulate the response before being sent to the client.
# Installation
```sh
npm install express-response-hooks
```# Usage
```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');
}
});
);
```# 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`
### res.hooks
The hooks [`EventEmitter`](https://nodejs.org/docs/latest/api/events.html#events_class_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
```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');
}
});
```### res.hooks.bypass
An object with references to the wrapped properties and functions for using them without triggering an event.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);
}
});
```# 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 by `send()`