DEV Community

Alex Spinov
Alex Spinov

Posted on

Nitro Has a Free API That Powers Every Nuxt and Analog Server

Nitro is the universal server engine behind Nuxt, Analog, and Vinxi. Its API lets you build server-agnostic backends that deploy anywhere.

Universal Server Routes

// server/routes/hello.ts
export default defineEventHandler((event) => {
  return { hello: "world" };
});

// server/routes/users/[id].ts
export default defineEventHandler(async (event) => {
  const id = getRouterParam(event, "id");
  const query = getQuery(event);
  const body = await readBody(event);
  const headers = getHeaders(event);
  return { id, query };
});
Enter fullscreen mode Exit fullscreen mode

Middleware

// server/middleware/auth.ts
export default defineEventHandler((event) => {
  const token = getHeader(event, "authorization");
  if (!token) throw createError({ statusCode: 401, message: "Unauthorized" });
  event.context.user = verifyToken(token);
});
Enter fullscreen mode Exit fullscreen mode

Storage API: Universal Key-Value

// nitro.config.ts
export default defineNitroConfig({
  storage: {
    cache: { driver: "redis", url: process.env.REDIS_URL },
    data: { driver: "fs", base: "./data" },
    assets: { driver: "s3", bucket: "my-bucket" },
  },
});

// Usage
export default defineEventHandler(async () => {
  await useStorage("cache").setItem("key", { data: "value" }, { ttl: 3600 });
  const cached = await useStorage("cache").getItem("key");
  const keys = await useStorage("data").getKeys();
  return { cached, keys };
});
Enter fullscreen mode Exit fullscreen mode

Scheduled Tasks

export default defineNitroConfig({
  scheduledTasks: {
    "*/5 * * * *": ["scrape:prices"],
    "0 0 * * *": ["cleanup:old-data"],
  },
});

// server/tasks/scrape/prices.ts
export default defineTask({
  meta: { description: "Scrape product prices" },
  run: async () => {
    const products = await $fetch("/api/products");
    // scrape logic...
    return { result: `Scraped ${products.length} products` };
  },
});
Enter fullscreen mode Exit fullscreen mode

WebSocket Support

// server/routes/_ws.ts
export default defineWebSocketHandler({
  open(peer) { peer.send(JSON.stringify({ type: "connected" })); },
  message(peer, message) {
    const data = JSON.parse(message.text());
    peer.send(JSON.stringify({ echo: data }));
  },
  close(peer) { console.log("Disconnected:", peer.id); },
});
Enter fullscreen mode Exit fullscreen mode

Deploy Anywhere

export default defineNitroConfig({
  preset: "cloudflare-pages" // or node, deno, bun, vercel, netlify, aws-lambda...
});
Enter fullscreen mode Exit fullscreen mode

Build server-side scraping APIs? My Apify tools complement any Nitro backend.

Custom server solution? Email spinov001@gmail.com

Top comments (0)