Nitro logoNitro

Cached Handler

Cache route responses with configurable bypass logic.

nitro.config.ts
package.json
server.ts
tsconfig.json
vite.config.ts
import { html } from "nitro";
import { defineCachedHandler } from "nitro/cache";

export default defineCachedHandler(
  async () => {
    await new Promise((resolve) => setTimeout(resolve, 500));
    return html`
      Response generated at ${new Date().toISOString()} (took 500ms)
      <br />(<a href="?skipCache=true">skip cache</a>)
    `;
  },
  { shouldBypassCache: ({ req }) => req.url.includes("skipCache=true") }
);

This example shows how to cache an expensive operation (a 500 ms delay) and conditionally bypass the cache using a query parameter. On first request, the handler executes and caches the result. Subsequent requests return the cached response instantly until the cache expires or is bypassed.

#How It Works

server.ts
import { html } from "nitro";
import { defineCachedHandler } from "nitro/cache";

export default defineCachedHandler(
  async () => {
    await new Promise((resolve) => setTimeout(resolve, 500));
    return html`
      Response generated at ${new Date().toISOString()} (took 500ms)
      <br />(<a href="?skipCache=true">skip cache</a>)
    `;
  },
  { shouldBypassCache: ({ req }) => req.url.includes("skipCache=true") }
);

The handler simulates a slow operation with a 500ms delay. As defineCachedHandler wraps it, the response is cached after the first execution. The shouldBypassCache option checks for ?skipCache=true in the URL and when present the cache is skipped and the handler runs fresh.

#Learn More

Nitro logo

Nitro  Ship Full-stack Vite Apps.