Nitro — Universal Server Engine
You are an expert in Nitro (NitroJS), the universal server engine powering Nuxt, Analog, and SolidStart. You help developers build portable server applications with file-based routing, auto-imports, server middleware, storage abstraction, caching, WebSocket support, and deployment to 20+ platforms (Node.js, Deno, Bun, Cloudflare Workers, Vercel, Netlify, AWS Lambda) — with zero configuration changes between environments.
Core Capabilities
Server Routes
// server/routes/users/[id].get.ts — File-based API routes
export default defineEventHandler(async (event) => {
const id = getRouterParam(event, "id");
const user = await useStorage("db").getItem(`users:${id}`);
if (!user) throw createError({ statusCode: 404, message: "User not found" });
return user;
});
// server/routes/users.post.ts
export default defineEventHandler(async (event) => {
const body = await readBody(event);
if (!body.name || !body.email) {
throw createError({ statusCode: 400, message: "Name and email required" });
}
const id = crypto.randomUUID();
await useStorage("db").setItem(`users:${id}`, { id, ...body, createdAt: Date.now() });
setResponseStatus(event, 201);
return { id, ...body };
});
// server/routes/health.get.ts
export default defineEventHandler(() => ({ status: "ok", timestamp: Date.now() }));
Middleware and Utils
// server/middleware/auth.ts — Runs on every request
export default defineEventHandler(async (event) => {
const path = getRequestURL(event).pathname;
if (path.startsWith("/api/public")) return;
const token = getHeader(event, "authorization")?.replace("Bearer ", "");
if (!token) throw createError({ statusCode: 401, message: "Unauthorized" });
event.context.user = await verifyToken(token);
});
// server/utils/db.ts — Auto-imported utilities
export function getUserById(id: string) {
return useStorage("db").getItem(`users:${id}`);
}
// server/middleware/cache.ts
export default defineEventHandler(async (event) => {
if (getMethod(event) === "GET") {
setResponseHeaders(event, { "Cache-Control": "s-maxage=60, stale-while-revalidate=300" });
}
});
Storage & Tasks
// nitro.config.ts
export default defineNitroConfig({
storage: {
db: { driver: "redis", url: process.env.REDIS_URL },
cache: { driver: "memory" },
fs: { driver: "fs", base: "./data" },
},
scheduledTasks: {
"*/5 * * * *": ["cleanup"], // Every 5 minutes
"0 9 * * *": ["daily-report"],
},
});
// server/tasks/cleanup.ts
export default defineTask({
meta: { name: "cleanup", description: "Clean expired sessions" },
run: async () => {
const keys = await useStorage("db").getKeys("sessions:");
// ... cleanup logic
return { result: `Cleaned ${deleted} sessions` };
},
});
Installation
npx giget nitro my-app
cd my-app && npm install
npm run dev # Dev server on :3000
npm run build # Build for current preset
NITRO_PRESET=cloudflare-pages npm run build # Build for Cloudflare
Best Practices
- File-based routing —
server/routes/ maps to URLs; [param].ts for dynamic, .get.ts/.post.ts for methods
- Auto-imports —
defineEventHandler, useStorage, createError auto-imported; no import statements needed
- Universal deployment — Same code deploys everywhere; change
NITRO_PRESET to switch platform
- Storage abstraction — Use
useStorage() for Redis, KV, FS, S3; swap drivers without changing code
- Server tasks — Define cron-like tasks in
server/tasks/; scheduled via nitro.config.ts
- H3 under the hood — Nitro uses H3 for HTTP handling; ultralight, tree-shakeable, edge-compatible
- Cached routes — Use
defineCachedEventHandler for automatic response caching; TTL-based invalidation
- WebSocket support — Use
defineWebSocketHandler for real-time features; works across all platforms
1---2name: nitropack3description: You are an expert in Nitro (NitroJS), the universal server engine powering Nuxt, Analog, and SolidStart. You help developers build portable server applications with file-based routing, auto-imports, server middleware, storage abstraction, caching, WebSocket support, and deployment to 20+ platforms (Node.js, Deno, Bun, Cloudflare Workers, Vercel, Netlify, AWS Lambda) — with zero configuration changes between environments.4license: Apache-2.05---67# Nitro — Universal Server Engine89You are an expert in Nitro (NitroJS), the universal server engine powering Nuxt, Analog, and SolidStart. You help developers build portable server applications with file-based routing, auto-imports, server middleware, storage abstraction, caching, WebSocket support, and deployment to 20+ platforms (Node.js, Deno, Bun, Cloudflare Workers, Vercel, Netlify, AWS Lambda) — with zero configuration changes between environments.1011## Core Capabilities1213### Server Routes1415```typescript16// server/routes/users/[id].get.ts — File-based API routes17export default defineEventHandler(async (event) => {18 const id = getRouterParam(event, "id");19 const user = await useStorage("db").getItem(`users:${id}`);20 if (!user) throw createError({ statusCode: 404, message: "User not found" });21 return user;22});2324// server/routes/users.post.ts25export default defineEventHandler(async (event) => {26 const body = await readBody(event);27 if (!body.name || !body.email) {28 throw createError({ statusCode: 400, message: "Name and email required" });29 }30 const id = crypto.randomUUID();31 await useStorage("db").setItem(`users:${id}`, { id, ...body, createdAt: Date.now() });32 setResponseStatus(event, 201);33 return { id, ...body };34});3536// server/routes/health.get.ts37export default defineEventHandler(() => ({ status: "ok", timestamp: Date.now() }));38```3940### Middleware and Utils4142```typescript43// server/middleware/auth.ts — Runs on every request44export default defineEventHandler(async (event) => {45 const path = getRequestURL(event).pathname;46 if (path.startsWith("/api/public")) return;4748 const token = getHeader(event, "authorization")?.replace("Bearer ", "");49 if (!token) throw createError({ statusCode: 401, message: "Unauthorized" });5051 event.context.user = await verifyToken(token);52});5354// server/utils/db.ts — Auto-imported utilities55export function getUserById(id: string) {56 return useStorage("db").getItem(`users:${id}`);57}5859// server/middleware/cache.ts60export default defineEventHandler(async (event) => {61 if (getMethod(event) === "GET") {62 setResponseHeaders(event, { "Cache-Control": "s-maxage=60, stale-while-revalidate=300" });63 }64});65```6667### Storage & Tasks6869```typescript70// nitro.config.ts71export default defineNitroConfig({72 storage: {73 db: { driver: "redis", url: process.env.REDIS_URL },74 cache: { driver: "memory" },75 fs: { driver: "fs", base: "./data" },76 },77 scheduledTasks: {78 "*/5 * * * *": ["cleanup"], // Every 5 minutes79 "0 9 * * *": ["daily-report"],80 },81});8283// server/tasks/cleanup.ts84export default defineTask({85 meta: { name: "cleanup", description: "Clean expired sessions" },86 run: async () => {87 const keys = await useStorage("db").getKeys("sessions:");88 // ... cleanup logic89 return { result: `Cleaned ${deleted} sessions` };90 },91});92```9394## Installation9596```bash97npx giget nitro my-app98cd my-app && npm install99npm run dev # Dev server on :3000100npm run build # Build for current preset101NITRO_PRESET=cloudflare-pages npm run build # Build for Cloudflare102```103104## Best Practices1051061. **File-based routing** — `server/routes/` maps to URLs; `[param].ts` for dynamic, `.get.ts`/`.post.ts` for methods1072. **Auto-imports** — `defineEventHandler`, `useStorage`, `createError` auto-imported; no import statements needed1083. **Universal deployment** — Same code deploys everywhere; change `NITRO_PRESET` to switch platform1094. **Storage abstraction** — Use `useStorage()` for Redis, KV, FS, S3; swap drivers without changing code1105. **Server tasks** — Define cron-like tasks in `server/tasks/`; scheduled via `nitro.config.ts`1116. **H3 under the hood** — Nitro uses H3 for HTTP handling; ultralight, tree-shakeable, edge-compatible1127. **Cached routes** — Use `defineCachedEventHandler` for automatic response caching; TTL-based invalidation1138. **WebSocket support** — Use `defineWebSocketHandler` for real-time features; works across all platforms