DEV Community

Alex Spinov
Alex Spinov

Posted on

Nitro Has a Free Universal Server Engine — Here's How to Use It

Building a backend that works on Vercel, Cloudflare Workers, AWS Lambda, AND a traditional server? Nitro compiles your code to run everywhere — write once, deploy anywhere.

What Is Nitro?

Nitro is a universal server engine from the UnJS ecosystem. It powers Nuxt 3's server, but works standalone too. Write your API once — Nitro adapts it to any deployment target.

Quick Start

npx giget@latest nitro my-api
cd my-api && npm install && npm run dev
Enter fullscreen mode Exit fullscreen mode
// routes/hello.ts
export default defineEventHandler(() => {
  return { message: 'Hello from Nitro!' };
});
// GET /hello → { "message": "Hello from Nitro!" }
Enter fullscreen mode Exit fullscreen mode

File-Based API Routing

routes/
  index.ts              → GET /
  users/
    index.get.ts        → GET /users
    index.post.ts       → POST /users
    [id].get.ts         → GET /users/:id
    [id].put.ts         → PUT /users/:id
    [id].delete.ts      → DELETE /users/:id
  health.ts             → GET /health
Enter fullscreen mode Exit fullscreen mode

Request Handling

// routes/users/index.post.ts
export default defineEventHandler(async (event) => {
  const body = await readBody(event);
  const query = getQuery(event);
  const id = getRouterParam(event, 'id');
  const header = getHeader(event, 'authorization');

  // Validation
  if (!body.email) {
    throw createError({ statusCode: 400, message: 'Email required' });
  }

  const user = await db.createUser(body);
  return user;
});
Enter fullscreen mode Exit fullscreen mode

Deploy Anywhere

# Build for different targets
NITRO_PRESET=vercel npm run build
NITRO_PRESET=cloudflare npm run build
NITRO_PRESET=aws-lambda npm run build
NITRO_PRESET=node-server npm run build
NITRO_PRESET=deno npm run build
NITRO_PRESET=bun npm run build
Enter fullscreen mode Exit fullscreen mode

Same code. Different output. Zero changes needed.

Built-In Features

Storage (KV, File, Redis)

// Use unified storage API
const storage = useStorage();

await storage.setItem('user:123', { name: 'John' });
const user = await storage.getItem('user:123');

// Configure backend in nitro.config.ts
export default defineNitroConfig({
  storage: {
    redis: { driver: 'redis', url: 'redis://localhost:6379' }
  }
});
Enter fullscreen mode Exit fullscreen mode

Caching

// routes/api/stats.ts
export default defineCachedEventHandler(async () => {
  const stats = await fetchExpensiveStats();
  return stats;
}, { maxAge: 60 * 10 }); // Cache for 10 minutes
Enter fullscreen mode Exit fullscreen mode

Scheduled Tasks

// tasks/cleanup.ts
export default defineTask({
  meta: { description: 'Clean up old sessions' },
  run() {
    return db.deleteExpiredSessions();
  }
});
Enter fullscreen mode Exit fullscreen mode

Why Nitro

Feature Nitro Express Fastify
Deploy targets 15+ Node only Node only
File routing Built-in Manual Plugin
TypeScript Native Manual setup Plugin
Auto-imports Yes No No
Hot reload Built-in nodemon Manual
Caching Built-in Manual Manual
Storage Unified API Manual Manual

Get Started


Building APIs that need web data? My Apify actors extract structured data from any website — feed it to your Nitro API. Custom solutions: spinov001@gmail.com

Top comments (0)