Cachios
A simple axios
cache wrapper using node-cache
.
Cachios is meant to be a replacement for the following pattern:
const axios = require('axios');
const resources = {};
function getResource(id) {
if (!resources[id]) {
return axios.get(`/api/thing/${id}`).then((resp) => {
resources[id] = resp.data;
return resp.data;
});
} else {
return Promise.resolve(resources[id]);
}
}
With Cachios, this is replaced with:
const cachios = require('cachios');
function getResource(id) {
return cachios.get(`/api/thing/${id}`).then((resp) => {
return resp.data;
});
}
The following axios
methods are supported:
- request
- get
- delete
- head
- options
- post
- put
- patch
The entire response is not cached, and is instead trimmed down (by default) to status
and data
. To configure this, see "Custom Response Copier".
Installation
npm install --save cachios
Examples
Basic:
const cachios = require('cachios');
cachios.get('https://jsonplaceholder.typicode.com/posts/1', {
ttl: 300 ,
}).then(console.log);
Custom axios client:
import axios from './configured-axios';
const cachios = require('cachios');
const cachiosInstance = cachios.create(axios);
const postData = {};
cachiosInstance.post('/posts/1', postData, {
ttl: 30,
}).then((resp) => {
console.log(resp.status);
const data = resp.data;
console.log(data.title);
console.log(data.body);
});
Multiple cached GET requests: Runkit
Multiple cached GET requests with different query parameters: Runkit
Configuration
TTL
To set the cache TTL, pass it in with your request config:
const cachios = require('cachios');
cachios.get('url', {
ttl: ,
});
const postData = {};
cachios.post('url', postData, {
headers:
...
ttl: 60,
});
Force Ignore Cache
To ignore existing cache items and force a fresh request to go through, use force: true
:
const cachios = require('cachios');
cachios.get('url');
cachios.get('url', {
force: true,
});
Custom Axios Instance
Cachios also supports using a pre-configured axios
instance:
const cachios = require('cachios');
const axios = require('axios');
const axiosInstance = axios.create({
baseURL: 'https://jsonplaceholder.typicode.com',
});
const cachiosInstance = cachios.create(axiosInstance);
Custom Cache Configuration
Internally, Cachios uses node-cache
with sane defaults. To configure it yourself, pass it during cachios.create
:
const cachios = require('cachios');
const axios = require('axios');
const cachiosInstance = cachios.create(axios, {
stdTTL: 0,
checkperiod: 0,
});
Alternative Cache Implementation
Don't want to use node-cache
? The .cache
property can be overridden.
cachios
expects the cache implementation to work as follows:
cachios.cache = {
get(cacheKey),
set(cacheKey, cacheValue, ttl),
}
Example using lru-cache
:
const cachios = require('cachios');
const LRU = require('lru-cache');
cachios.cache = LRU(500);
cachios.get('http://example.com/')
.then(() => cachios.get('http://example.com/'));
.then(() => {
console.log(cachios.cache.itemCount);
});
Example of persistent cache with keyv
and @keyv/sqlite
:
const cachios = require('cachios');
const Keyv = require('keyv');
cachios.cache = new Keyv('sqlite://cache.sqlite');
cachios.get('http://example.com/')
.then(() => cachios.get('http://example.com/'));
.then(() => cachios.cache.opts.store.query('SELECT COUNT(*) as count FROM keyv'))
.then((cacheSize) => {
console.log(cacheSize[0].count);
});
Custom Response Copier
By default, Cachios uses the following function to trim responses:
function defaultResponseCopier(response) {
return {
status: response.status,
data: response.data,
};
}
This was originally implemented because of errors during response storage.
To change what is saved, set the getResponseCopy
property of your Cachios instance:
const cachios = require('cachios');
cachios.getResponseCopy = function (response) {
return {
status: response.status,
statusText: response.statusText,
data: response.data,
};
};
Custom Cache Identifier
By default, Cachios uses the following function to create a unique cache identifier:
function defaultCacheIdentifer(config) {
return {
method: config.method,
url: config.url,
params: config.params,
data: config.data,
};
}
To override this, set the getCacheIdentifier
property of your Cachios instance:
const cachios = require('cachios');
cachios.getCacheIdentifier = function (config) {
return {
method: config.method,
url: config.url,
params: config.params,
data: config.data,
headers: config.headers,
};
};
Custom object-hash Replacer
By default, Cachios uses an internal defaultReplacer
function to add FormData support to object-hash.
To override this, set the getReplaced
property of your Cachios instance:
const cachios = require('cachios');
cachios.getReplaced = function (thing) {
if (thing === 'foo') {
return 'bar';
}
return thing;
};
License
MIT