Zum Inhalt springen

Cache-Middleware ​

Die Cache-Middleware verwendet die Cache-API der Webstandards.

Derzeit unterstützt die Cache-Middleware Cloudflare-Workers-Projekte mit eigenen Domains und Deno-Projekte mit Deno 1.26+. Sie funktioniert auch mit Deno Deploy.

Cloudflare Workers berücksichtigt den Header Cache-Control und gibt zwischengespeicherte Antworten zurück. Details findest du unter Cache in der Cloudflare-Dokumentation. Deno berücksichtigt die Header nicht. Wenn du den Cache aktualisieren musst, brauchst du deshalb einen eigenen Mechanismus.

Anleitungen für die einzelnen Plattformen findest du unten unter Verwendung.

Import ​

ts
import { Hono } from 'hono'
import { cache } from 'hono/cache'

Verwendung ​

ts
app.get(
  '*',
  cache({
    cacheName: 'my-app',
    cacheControl: 'max-age=3600',
  })
)
ts
// Must use `wait: true` for the Deno runtime
app.get(
  '*',
  cache({
    cacheName: 'my-app',
    cacheControl: 'max-age=3600',
    wait: true,
  })
)

QUERY-Anfragen zwischenspeichern ​

Die Cache-Middleware speichert auch Antworten auf QUERY-Anfragen zwischen. Wie in RFC 10008 vorgeschrieben, enthält der Cache-Schlüssel einer QUERY-Anfrage einen Digest des Anfrageinhalts und seiner Repräsentationsmetadaten. Anfragen mit unterschiedlichen Bodys werden daher getrennt zwischengespeichert.

QUERY-Anfragen mit einem Body größer als maxQueryBodySize, standardmäßig 64 KiB, umgehen den Cache.

Info

Dazu werden Cache-Einträge unter einem internen Schlüssel der Form /.hono/cache?__hono_cache_key=... statt unter der Anfrage-URL selbst gespeichert. Wenn du Cache-Einträge direkt über die Cache-API löschst, etwa durch Aufrufen von caches.delete() mit der ursprünglichen Anfrage-URL, musst du diese Logik anpassen. Dies gilt für alle Methoden, einschließlich GET.

Optionen ​

required cacheName: string | (c: Context) => string | Promise<string> ​

Der Name des Caches. Damit lassen sich mehrere Caches mit verschiedenen Bezeichnern speichern.

optional wait: boolean ​

Ein boolescher Wert, der angibt, ob Hono auf die Auflösung des Promises von cache.put warten soll, bevor die Anfrage weiterverarbeitet wird. In der Deno-Umgebung muss der Wert true sein. Der Standardwert ist false.

optional cacheControl: string ​

Eine Zeichenfolge mit Direktiven für den Header Cache-Control. Weitere Informationen findest du in der MDN-Dokumentation. Wenn diese Option fehlt, wird den Anfragen kein Header Cache-Control hinzugefügt.

optional vary: string | string[] ​

Setzt den Header Vary in der Antwort. Wenn die ursprüngliche Antwort bereits Vary enthält, werden die Werte zusammengeführt und Duplikate entfernt. Der Wert * führt zu einem Fehler. Weitere Informationen zum Vary-Header und seinen Auswirkungen auf Cache-Strategien findest du in der MDN-Dokumentation.

optional keyGenerator: (c: Context) => string | Promise<string> ​

Erzeugt Schlüssel für jede Anfrage im Speicher cacheName. So kannst du Daten anhand von Anfrage- oder Kontextparametern zwischenspeichern. Der Standardwert ist c.req.url. Bei QUERY-Anfragen enthält der Schlüssel zusätzlich einen Digest des Anfrageinhalts und seiner Repräsentationsmetadaten.

optional maxQueryBodySize: number ​

Die maximale Größe eines QUERY-Anfrage-Bodys in Bytes, der zwischengespeichert werden kann. QUERY-Anfragen mit größeren Bodys umgehen den Cache. Der Standardwert ist 65536 (64 KiB).

optional cacheableStatusCodes: number[] ​

Ein Array der Statuscodes, die zwischengespeichert werden sollen. Der Standardwert ist [200]. Verwende diese Option, um Antworten mit bestimmten Statuscodes zwischenzuspeichern.

ts
app.get(
  '*',
  cache({
    cacheName: 'my-app',
    cacheControl: 'max-age=3600',
    cacheableStatusCodes: [200, 404, 412],
  })
)

optional onCacheNotAvailable: ((reason: string) => void | Promise<void>) | false ​

Eine Callback-Funktion oder false, die das Verhalten steuert, wenn die Cache-API global nicht verfügbar ist oder QUERY-Caching Web Crypto nicht verwenden kann. Der Callback erhält den Grund. Standardmäßig wird er mit console.log protokolliert. Du kannst eine eigene Funktion für ein angepasstes Verhalten angeben oder mit false die Protokollierung vollständig unterdrücken.

ts
// Custom logging
app.use(
  cache({
    cacheName: 'my-app-v1',
    onCacheNotAvailable: () => {
      console.log('Custom log: Cache API is not available.')
    },
  })
)
ts
// Suppress logging
app.use(
  cache({
    cacheName: 'my-app-v1',
    onCacheNotAvailable: false,
  })
)

Veröffentlicht unter der MIT-Lizenz.