mirror of
https://github.com/arthurfiorette/axios-cache-interceptor.git
synced 2025-12-08 17:36:16 +00:00
88 lines
2.7 KiB
Markdown
88 lines
2.7 KiB
Markdown
# Request id
|
|
|
|
Every request passed through this interceptor, has an id. **This doesn't mean its a UNIQUE
|
|
ID**.
|
|
|
|
Each request id are responsible for binding a request to its cache, for referencing (or
|
|
invalidating) it later and to make the interceptor treat each request with the same id as
|
|
the same request.
|
|
|
|
The id generation is good enough to generate the same id for theoretically sames requests.
|
|
A simple example is a request with `{ baseURL: 'https://a.com/', url: '/b' }` results to
|
|
the same id with `{ url: 'https://a.com/b/' }`.
|
|
|
|
> If you send two completely different requests with the same id, the interceptor will
|
|
> treat them as the same request, sharing its cache and every other as.
|
|
|
|
```js #runkit
|
|
const axios = require('axios');
|
|
const { setupCache } = require('axios-cache-interceptor');
|
|
|
|
// Global
|
|
setupCache(axios);
|
|
|
|
const { id } = await axios.get('https://jsonplaceholder.typicode.com/posts/1', {
|
|
baseURL: 'baseURL',
|
|
query: { name: 'value' }
|
|
});
|
|
|
|
// Generated
|
|
console.log('Id 1: ' + id);
|
|
console.log('Cache 1:', await axios.storage.get(id));
|
|
|
|
const { id: id2 } = await axios.get('https://jsonplaceholder.typicode.com/posts/1', {
|
|
id: 'my-overridden-id'
|
|
});
|
|
|
|
// Specified
|
|
console.log('Id 2: ' + id2);
|
|
console.log('Cache 2:', await axios.storage.get(id2));
|
|
```
|
|
|
|
The
|
|
[default](https://github.com/arthurfiorette/axios-cache-interceptor/blob/main/src/util/key-generator.ts)
|
|
id generation can clarify this idea.
|
|
|
|
## Joining requests
|
|
|
|
Two requests will be treated as the same if they have the same `id` property. If it was
|
|
not defined, it will be auto generated by the provided `Key Generator`.
|
|
|
|
You can override their `id` property by providing a custom one.
|
|
|
|
```js
|
|
const response = await axios.get('url', {
|
|
id: 'my overridden id'
|
|
});
|
|
|
|
// Response.id always returns the resolved it for the specific request. (In this case, 'my overridden id')
|
|
response.id === 'my overridden id';
|
|
```
|
|
|
|
## Custom generator
|
|
|
|
Everything that is used to treat two requests as same or not, is done by the `generateKey`
|
|
property.
|
|
|
|
The value is hashed into a signed integer when the returned value from the provided
|
|
generator is not a `string` or a `number`.
|
|
|
|
By default, it uses the `method`, `baseURL`, `params`, `data` and `url` properties from
|
|
the request object into an hash code generated by the
|
|
[`object-code`](https://www.npmjs.com/package/object-code) library.
|
|
|
|
If you need to change or share the cache for two requests based on other properties, like
|
|
headers and etc, you can create your own Key Generator:
|
|
|
|
```js
|
|
const generator = buildKeyGenerator(({ headers = {} }) => {
|
|
// In this imaginary example, two requests will
|
|
// be treated as the same if their x-cache-server header is the same.
|
|
return headers['x-cache-server'] || 'not-set';
|
|
});
|
|
|
|
const axios = mockAxios({
|
|
generateKey: generator
|
|
});
|
|
```
|