Appearance
Cache Management API
This feature provides several API endpoints to manage the caches. You can get a list of cache items, inspect cache items, delete items by key or delete items by cache tags.
Configuration
typescript
import { defineNuxtConfig } from 'nuxt'
export default defineNuxtConfig({
multiCache: {
api: {
enabled: true,
prefix: '/__nuxt_multi_cache',
authorization: 'hunter2',
cacheTagInvalidationDelay: 60000
}
}
}
typescript
// ~/server/multiCache.serverOptions.ts
import { defineMultiCacheOptions } from 'nuxt-multi-cache/dist/runtime/serverOptions'
import { isAuthenticated } from './somewhere'
export default defineMultiCacheOptions({
api: {
// Use a custom method that checks authorization. Can be something like
// cookie, basic auth or request IP.
authorization: async function (event) {
return await isAuthenticated(event)
},
},
})
Authorization
By default the endpoints are not accesible without authorization.
Token based (x-nuxt-multi-cache-token)
This is the authorization used when the provided api.authorization
value is a string. In this case the token is expected in the x-nuxt-multi-cache-token
header:
typescript
fetch('http://localhost:3000/__nuxt_multi_cache/purge/component', {
method: 'POST',
headers: {
'x-nuxt-multi-cache-token': 'hunter2',
},
body: JSON.stringify(['Navbar::de--chf']),
})
bash
curl -X POST -i \
-H "Content-Type: application/json" \
-H "x-nuxt-multi-cache-token: hunter2" \ // [!code focus]
--data '["Navbar::de--chf"]' \
http://localhost:3000/__nuxt_multi_cache/purge/component
Custom Callback
You can also implement your own authorization check via the server options.
Disabled
You can disable authorization by setting the value of api.authorization
to false
. Only do this if the endpoints are not accessible publicly!
Purge Everything
Purges everything from all caches.
typescript
fetch('http://localhost:3000/__nuxt_multi_cache/purge/all', {
method: 'POST',
headers: {
'x-nuxt-multi-cache-token': 'hunter2',
},
})
bash
curl -X POST -i \
-H "x-nuxt-multi-cache-token: hunter2" \
http://localhost:3000/__nuxt_multi_cache/purge/all
Response
json
{
"status": "OK"
}
Purge Item
Purge one or more cache items by key.
Example: Purge component with key Navbar::de--chf
typescript
fetch('http://localhost:3000/__nuxt_multi_cache/purge/component', {
method: 'POST',
headers: {
'x-nuxt-multi-cache-token': 'hunter2',
},
body: JSON.stringify(['Navbar::de--chf']),
})
bash
curl -X POST -i \
-H "Content-Type: application/json" \
-H "x-nuxt-multi-cache-token: hunter2" \
--data '["Navbar::de--chf"]' \
http://localhost:3000/__nuxt_multi_cache/purge/component
Response
json
{
"status": "OK",
"affectedKeys": ["Navbar::de--chf"]
}
Example: Purge two specific pages
typescript
fetch('http://localhost:3000/__nuxt_multi_cache/purge/route', {
method: 'POST',
headers: {
'x-nuxt-multi-cache-token': 'hunter2',
},
body: JSON.stringify(['/about', '/product/123']),
})
bash
curl -X POST -i \
-H "Content-Type: application/json" \
-H "x-nuxt-multi-cache-token: hunter2" \
--data '["/about", "/product/123"]' \
http://localhost:3000/__nuxt_multi_cache/purge/route
Response
json
{
"status": "OK",
"affectedKeys": ["/about", "/product/123"]
}
Purge Tags
Purge cache items by cache tags.
INFO
All tags are collected for some time (default: 1min), after which the cache items are purged. This is because cache tags are stored together with the items. This means that every item needs to be loaded from the cache and its tags checked.
The delay is configurable via the api.cacheTagInvalidationDelay
option.
Example Purge all cache items with cache tag language:de
typescript
fetch('http://localhost:3000/__nuxt_multi_cache/purge/tags', {
method: 'POST',
headers: {
'x-nuxt-multi-cache-token': 'hunter2',
},
body: JSON.stringify(['language:de']),
})
bash
curl -X POST -i \
-H "Content-Type: application/json" \
-H "x-nuxt-multi-cache-token: hunter2" \
--data '["language:de"]' \
http://localhost:3000/__nuxt_multi_cache/purge/tags
Response
json
{
"status": "OK",
"tags": ["language:de"]
}
Get Stats
Get a list of all items in a cache.
Example: Get a list of all cached components
typescript
fetch('http://localhost:3000/__nuxt_multi_cache/stats/component', {
headers: {
'x-nuxt-multi-cache-token': 'hunter2',
},
})
bash
curl -i \
-H "x-nuxt-multi-cache-token: hunter2" \
http://localhost:3000/__nuxt_multi_cache/stats/component
Response
json
{
"status": "OK",
"rows": [
{
"key": "RandomNumber",
"data": "<div><h3>Component with random number</h3><div>RANDOM_NUMBER__686204309__</div></div>"
},
{
"key": "Navbar:navbar",
"data": {
"payload": {
"navbar": [
{
"userId": "39a2cbd1-5355-42ee-b519-a378ac12ecf4",
"username": "Morris.Sipes93",
"email": "Eda_Barton@hotmail.com",
"avatar": "https://cloudflare-ipfs.com/ipfs/Qmd3W5DuhgHirLHGVixi6V76LhCkZUz6pnFt5AJBiyvHye/avatar/1116.jpg",
"password": "KQ6UY3mgK6VZsJd",
"birthdate": "1948-01-06T21:31:06.050Z",
"company": "Ward Group",
"registeredAt": "2022-01-06T19:41:51.910Z"
}
]
},
"data": "<nav class=\"menu\"><div class=\"menu-label\">User Management</div><ul class=\"menu-list\"><!--[--><li><a href=\"/user/39a2cbd1-5355-42ee-b519-a378ac12ecf4\" class=\"\"><div>Morris.Sipes93</div></a></li><li><a href=\"/user/21ef84d0-fc1e-44f6-8ba7-038eba022140\" class=\"\"><div>Toni_Lehner95</div></a></li><li><a href=\"/user/b7c1f5eb-d8ca-4e55-8327-c0fd27029cfc\" class=\"\"><div>Clay.Marvin6</div></a></li><li><a href=\"/user/bbaf0d1b-a446-4f68-b745-c61cd4b5adf6\" class=\"\"><div>Chanel76</div></a></li><li><a href=\"/user/4aeac8ae-7ddf-4f8d-a015-3b059f00b554\" class=\"\"><div>Lurline.Reinger97</div></a></li><li><a href=\"/user/97625fcb-c105-4191-9614-92abc4f06b02\" class=\"\"><div>Theodora.Harris13</div></a></li><li><a href=\"/user/d537b431-ed2c-41f3-8b08-771cb0bdf88a\" class=\"\"><div>Garth.Kuphal</div></a></li><li><a href=\"/user/6575f732-8330-4543-b6b0-4d6bf863b9d3\" class=\"\"><div>Fannie36</div></a></li><li><a href=\"/user/e998007e-3cc6-45b5-9e57-1b64a339f748\" class=\"\"><div>Peggie57</div></a></li><li><a href=\"/user/3552155b-47d6-490f-9469-aa3861410af1\" class=\"\"><div>Tina_Lakin</div></a></li><li><a href=\"/user/763c86fe-1202-4ac1-84cd-2aa037a8b13a\" class=\"\"><div>Minnie.Fisher6</div></a></li><li><a href=\"/user/8cccd3b8-4655-4dc6-8058-d916c8ed1d7c\" class=\"\"><div>Lillian28</div></a></li><li><a href=\"/user/5252b0ab-71e1-4c0e-a368-9baac986f6a1\" class=\"\"><div>Brielle84</div></a></li><li><a href=\"/user/b91f68eb-b20d-4d37-9d2a-221263afe62f\" class=\"\"><div>Oleta58</div></a></li><li><a href=\"/user/e72dc150-6cc2-468d-b09c-6cda68de897b\" class=\"\"><div>Tristian18</div></a></li><li><a href=\"/user/6db46653-6b5f-4fc9-b594-f0593b6734f7\" class=\"\"><div>Diamond_Watsica</div></a></li><li><a href=\"/user/39aa5c69-9cb0-42cd-8dcf-bebc029efd6e\" class=\"\"><div>Emma92</div></a></li><li><a href=\"/user/05946ea1-8395-4a49-98f8-edb12865f2b0\" class=\"\"><div>Guillermo_Deckow</div></a></li><li><a href=\"/user/ec5ed51d-880d-4a5e-84a3-96c12d1bc543\" class=\"\"><div>Shanny.Wolff33</div></a></li><li><a href=\"/user/1b555aad-db68-4da7-9a6b-442e8ee1a5f0\" class=\"\"><div>Whitney.Johns2</div></a></li><li><a href=\"/user/c8dc7fea-1a92-486f-a14d-366363aec9d7\" class=\"\"><div>Mertie98</div></a></li><li><a href=\"/user/a7b8938b-e98e-4be0-b0c2-851a08297757\" class=\"\"><div>Colt.Fadel94</div></a></li><li><a href=\"/user/abaa3c97-9ddb-402a-b0f6-1eb198591ddb\" class=\"\"><div>General39</div></a></li><li><a href=\"/user/dc0cbecd-c7ac-4f77-9a0e-07e93ae32d5c\" class=\"\"><div>Beryl.Pfeffer</div></a></li><li><a href=\"/user/8d62b5af-9f72-4a96-a630-ca20ebe563c6\" class=\"\"><div>Amara.Torp</div></a></li><li><a href=\"/user/7dbd1dbc-2edc-4b24-b808-5a6f5513bc61\" class=\"\"><div>Adah.Shanahan14</div></a></li><li><a href=\"/user/f0390c1a-a6aa-4619-aa8b-ae301124e6e1\" class=\"\"><div>Jakayla.Weissnat69</div></a></li><li><a href=\"/user/56183ace-6df4-44b8-8b94-f9580200e89f\" class=\"\"><div>Rogelio85</div></a></li><li><a href=\"/user/bbf22b16-086a-4722-a826-702f93d0889f\" class=\"\"><div>Francisca.Schoen</div></a></li><li><a href=\"/user/33b639ce-5e77-49f5-ad64-db961626ac9a\" class=\"\"><div>Viola.Paucek</div></a></li><li><a href=\"/user/f0e4c598-8ee9-4d4f-a374-624d71c11c57\" class=\"\"><div>Juston.Yost92</div></a></li><li><a href=\"/user/f32e5726-cc61-446a-885c-760bbd8c6927\" class=\"\"><div>Elisabeth87</div></a></li><li><a href=\"/user/469f3fe5-0809-498f-bf87-deaa7cb92f0b\" class=\"\"><div>Kara.Gerlach</div></a></li><li><a href=\"/user/6701a0d0-731e-42e1-b829-d9a68082bfd3\" class=\"\"><div>Virgil.Donnelly</div></a></li><li><a href=\"/user/00a3c2b5-0ebe-4dfe-b449-007d6358f5f9\" class=\"\"><div>Priscilla.Larson81</div></a></li><li><a href=\"/user/93c05ae9-9b32-41f5-87ba-9083e222de5d\" class=\"\"><div>Wilbert.Nienow4</div></a></li><li><a href=\"/user/408a819f-4466-40b9-bf2d-d70ab346a17d\" class=\"\"><div>Casandra_Koch97</div></a></li><li><a href=\"/user/8c73b048-4fcb-489a-b25d-c42820d79378\" class=\"\"><div>Ettie_Wunsch96</div></a></li><li><a href=\"/user/6ec6cfb3-add2-4fe6-8bdd-f8ada6b40634\" class=\"\"><div>Myrtie.Armstrong31</div></a></li><li><a href=\"/user/9a248b35-3170-46d9-9b32-eec604dddf64\" class=\"\"><div>Kristy88</div></a></li><li><a href=\"/user/00e5b583-dfd9-457b-967a-d996656c7838\" class=\"\"><div>Fern69</div></a></li><li><a href=\"/user/f8f942cb-68c1-4ca4-9260-237f453a2f3d\" class=\"\"><div>Jamil8</div></a></li><li><a href=\"/user/daa8f430-e028-4286-9aff-1aed84837f3a\" class=\"\"><div>Charlie.Baumbach59</div></a></li><li><a href=\"/user/d08c8290-d141-4f14-aefd-5a64077f40cf\" class=\"\"><div>Jerel92</div></a></li><li><a href=\"/user/547f6abc-826f-4556-9a25-a2c6d05ba309\" class=\"\"><div>Noemi_Hackett</div></a></li><li><a href=\"/user/44ff5048-454e-431d-a536-0d872a925c86\" class=\"\"><div>Palma.Harris41</div></a></li><li><a href=\"/user/19c78f97-d1fe-441e-9670-abc49c6b6904\" class=\"\"><div>Andrew.Kris</div></a></li><li><a href=\"/user/86e40067-3ea7-4f08-ae46-c63a774172dc\" class=\"\"><div>Alize80</div></a></li><li><a href=\"/user/b0c5de1c-3510-4687-b380-05fff955329d\" class=\"\"><div>Daisha54</div></a></li><li><a href=\"/user/e27c637e-71be-499d-86e3-f961a9f42895\" class=\"\"><div>Aileen65</div></a></li><li><a href=\"/user/4d19b09e-7d41-45fd-a28d-9bbeadb088ef\" class=\"\"><div>Hassie_Keebler</div></a></li><li><a href=\"/user/fd15318d-f157-4b7f-8fe8-942c684c5659\" class=\"\"><div>Justice_Renner48</div></a></li><li><a href=\"/user/dd47a3cb-4ed8-450b-afd1-64029c3411a8\" class=\"\"><div>Jana_Lindgren</div></a></li><li><a href=\"/user/4104f890-ffa5-48a6-a22f-f67a8c34818c\" class=\"\"><div>Gerson_Mohr</div></a></li><li><a href=\"/user/52f00f81-8e4c-45ea-8f87-90159b2ec8a5\" class=\"\"><div>Eudora3</div></a></li><li><a href=\"/user/41d8ab07-05f2-4c64-83cc-63d43714b504\" class=\"\"><div>Okey52</div></a></li><li><a href=\"/user/965ef3ba-b980-4b7b-b9a4-7d334f25cbf9\" class=\"\"><div>Melba.Larkin</div></a></li><li><a href=\"/user/95be11ca-17e1-4406-93cd-6e35cdb304ef\" class=\"\"><div>Ethelyn28</div></a></li><li><a href=\"/user/4e6640ac-542c-4ba8-bf12-46977227d8b6\" class=\"\"><div>Rafaela_Reynolds61</div></a></li><li><a href=\"/user/e269d239-a2e5-4363-8657-93aca32351c1\" class=\"\"><div>Patsy84</div></a></li><li><a href=\"/user/5171ba0e-32bc-47d7-a277-df5f867db141\" class=\"\"><div>Jarrett.Walter63</div></a></li><li><a href=\"/user/6e913422-3e4a-44ed-82e3-a7f94b2e9903\" class=\"\"><div>Roscoe_Kautzer84</div></a></li><li><a href=\"/user/0a3f5804-eb14-4240-8592-654fc089b25e\" class=\"\"><div>Wilbert92</div></a></li><li><a href=\"/user/e82ebbc4-9d80-4b92-b727-b4ebae5532ba\" class=\"\"><div>Neoma51</div></a></li><li><a href=\"/user/6c0992a8-deac-4142-bb30-1fe6926be421\" class=\"\"><div>Maybelle.Gerlach66</div></a></li><li><a href=\"/user/2a626912-ab62-443e-87ec-97770e2792be\" class=\"\"><div>Otilia.Baumbach71</div></a></li><li><a href=\"/user/991526d1-b646-42a6-8726-f97282b72303\" class=\"\"><div>Stacy.Marks52</div></a></li><li><a href=\"/user/2d9cbc1a-27ac-42fe-96ab-68c877be529d\" class=\"\"><div>Stephen_Murphy94</div></a></li><li><a href=\"/user/f1051c2b-8a22-479f-9844-b2b01130477e\" class=\"\"><div>Peter_Hickle</div></a></li><li><a href=\"/user/7a88feda-d737-44ea-a365-4fc51d0a8251\" class=\"\"><div>Rebeka.Stanton79</div></a></li><li><a href=\"/user/6958d9f9-2d3c-4f7a-8176-c98adc3df90e\" class=\"\"><div>Haley71</div></a></li><li><a href=\"/user/7c28ce1a-3c4f-42ee-9b09-58fac6cf6e25\" class=\"\"><div>Lawrence.Runte</div></a></li><li><a href=\"/user/ac67e362-2a2c-4cbb-8e53-e375686f21f9\" class=\"\"><div>Izabella55</div></a></li><li><a href=\"/user/f0c9587e-3bbf-448f-b8b7-abc4b1f87349\" class=\"\"><div>Deanna_Crist</div></a></li><li><a href=\"/user/749b7e30-6da2-4861-8b7e-b1fdf8474c66\" class=\"\"><div>Branson_Windler</div></a></li><li><a href=\"/user/c9ebdb78-5bcf-46ac-b516-c679459d0bf0\" class=\"\"><div>Frederique.Olson47</div></a></li><li><a href=\"/user/e830119e-1204-4024-98be-6e7b393f2168\" class=\"\"><div>Kale.Ferry</div></a></li><li><a href=\"/user/43b2fd88-e4de-4d38-a8e9-b41043fffdad\" class=\"\"><div>Tessie_Streich10</div></a></li><li><a href=\"/user/d64cad41-ae8a-4537-81a9-688763600b48\" class=\"\"><div>Fabian_Dickinson</div></a></li><li><a href=\"/user/5541b857-3b66-45fe-a477-2de33bc7f4b6\" class=\"\"><div>Emmitt.Pouros59</div></a></li><li><a href=\"/user/921163c6-d3cf-4f2e-bd79-b62fefa391d8\" class=\"\"><div>Amanda.Bayer40</div></a></li><li><a href=\"/user/d5dbb6a8-6c40-4dc1-88ca-b7d6b7119d2f\" class=\"\"><div>Coby.Macejkovic</div></a></li><li><a href=\"/user/fa6af5fe-9773-471f-b0a4-55e45a27d86d\" class=\"\"><div>Waino.Greenholt79</div></a></li><li><a href=\"/user/f21f5ac2-96e0-4552-8046-8cb2b2ba2b61\" class=\"\"><div>Natalie_Rodriguez35</div></a></li><li><a href=\"/user/37c4649d-9c9c-4997-bd51-eafa05f33846\" class=\"\"><div>Mozelle_Jakubowski67</div></a></li><li><a href=\"/user/a5ad0979-b8dc-4629-a785-544fa692a4a2\" class=\"\"><div>Tristian.Kub</div></a></li><li><a href=\"/user/7f990462-fa52-413f-b0dc-963e834e963e\" class=\"\"><div>Ernestine17</div></a></li><li><a href=\"/user/d309aafc-9dbd-4a61-bf2e-65e9cfa3872f\" class=\"\"><div>Gabrielle_Bechtelar34</div></a></li><li><a href=\"/user/cdd0d705-da86-4cb1-a34f-f0fad9ba0ad8\" class=\"\"><div>Harvey.Schmeler8</div></a></li><li><a href=\"/user/cdded4d9-5349-4e1b-8ebe-903f86d988d2\" class=\"\"><div>Bartholome.Kunde62</div></a></li><li><a href=\"/user/f9994317-8087-4a8c-9e70-eea0d068d605\" class=\"\"><div>Miguel_Cartwright</div></a></li><li><a href=\"/user/44c49163-0fd3-4a53-960f-7b3c0f2711fd\" class=\"\"><div>Anabel.Raynor</div></a></li><li><a href=\"/user/68cdb875-5c78-4ec3-9bb0-80ca67e319db\" class=\"\"><div>Rosario_Paucek</div></a></li><li><a href=\"/user/0e8e6eae-7a05-41c2-81ac-810b386e69da\" class=\"\"><div>Floy.Boehm70</div></a></li><li><a href=\"/user/30c3cb1b-ed38-46f2-a075-c668c1800c73\" class=\"\"><div>Neal71</div></a></li><li><a href=\"/user/0735f8c1-a936-45ea-95ec-15d81025f6f9\" class=\"\"><div>Federico.Schulist78</div></a></li><li><a href=\"/user/16eca0de-2305-40b8-becd-ac36215f7b91\" class=\"\"><div>Aniyah.Kemmer5</div></a></li><li><a href=\"/user/50a25953-0684-4571-94d4-16d40159e48a\" class=\"\"><div>Anthony.Boyer61</div></a></li><li><a href=\"/user/ddb67f21-b04c-4850-a187-7d50c5f37ef7\" class=\"\"><div>Clare.Feest</div></a></li><li><a href=\"/user/e5d21e08-c98d-496d-ae2b-456a425aac4e\" class=\"\"><div>Carli_Cartwright74</div></a></li><!--]--></ul></nav>",
"cacheTags": []
}
}
],
"total": 2
}
Inspect
Inspect a cache item. The key should be provided as a query param key
.
Example: Get the markup of the cached component with key Navbar::de
typescript
fetch(
'http://localhost:3000/__nuxt_multi_cache/inspect/component?key=RandomNumber',
{
headers: {
'x-nuxt-multi-cache-token': 'hunter2',
},
},
)
bash
curl -i \
-H "x-nuxt-multi-cache-token: hunter2" \
http://localhost:3000/__nuxt_multi_cache/inspect/component?key=RandomNumber
Response
html
<div>
<h3>Component with random number</h3>
<div>RANDOM_NUMBER__837458809__</div>
</div>
Example: Get the details of a cached route
typescript
fetch('http://localhost:3000/__nuxt_multi_cache/inspect/route?key=api:test', {
headers: {
'x-nuxt-multi-cache-token': 'hunter2',
},
})
bash
curl -i \
-H "x-nuxt-multi-cache-token: hunter2" \
http://localhost:3000/__nuxt_multi_cache/inspect/route?key=api:test
Response
json
{
"data": "{\n \"api\": \"This is data from the API.\",\n \"now\": \"2022-12-31T08:07:43.737Z\",\n \"cacheTags\": [\n \"page:1\",\n \"image:234\",\n \"user:32\",\n \"language\",\n \"translations\"\n ]\n}",
"headers": {
"content-type": "application/json",
"surrogate-control": "max-age=0, must-revalidate, public, stale-while-revalidate=60000, stale-if-error=24000"
},
"statusCode": 200,
"expires": 1672474074,
"cacheTags": [
"page:1",
"image:234",
"user:32",
"language",
"translations"
]
}