Nuxt 4 builds on the Nitro server engine to provide a powerful API layer with automatic imports, server routes, and edge-ready deployment.
Server API Routes
// server/api/posts.get.ts
export default defineEventHandler(async (event) => {
const query = getQuery(event);
const posts = await db.post.findMany({
take: Number(query.limit) || 10,
orderBy: { createdAt: "desc" }
});
return posts;
});
// server/api/posts.post.ts
export default defineEventHandler(async (event) => {
const body = await readBody(event);
const post = await db.post.create({ data: body });
return post;
});
Server Middleware
// server/middleware/auth.ts
export default defineEventHandler((event) => {
const token = getHeader(event, "authorization");
if (!token && event.path.startsWith("/api/admin")) {
throw createError({ statusCode: 401, message: "Unauthorized" });
}
});
Composables with Server Data
// composables/usePosts.ts
export function usePosts() {
return useFetch("/api/posts", {
key: "posts",
transform: (data) => data.map(formatPost)
});
}
Nitro Storage Layer
// server/api/cache.ts
export default defineEventHandler(async (event) => {
const storage = useStorage();
const cached = await storage.getItem("mydata");
if (cached) return cached;
const fresh = await fetchExpensiveData();
await storage.setItem("mydata", fresh, { ttl: 3600 });
return fresh;
});
Key Features
- File-based API routing with HTTP method suffixes
- Nitro engine for edge deployment
- Auto-imports for server utilities
- TypeScript-first with full type inference
- Hybrid rendering (SSR, SSG, ISR, SWR per route)
Need to scrape or monitor web data at scale? Check out my web scraping actors on Apify — ready-made tools that extract data from any website in minutes. Or email me at spinov001@gmail.com for custom solutions.
Top comments (0)