# 2026'da Nuxt Nitro ve Server Routes: Full-Stack Vue ve API Endpoints > Full-stack Vue uygulamaları oluşturmak için Nuxt Nitro server routes konusunda uzmanlaşın. API endpoints, middleware, veritabanı entegrasyonu ve Nuxt 4 ile production deployment kalıplarını öğrenin. - Published: 2026-07-16 - Updated: 2026-07-16 - Author: SharpSkill - Tags: nuxt, nitro, vue, full-stack, api, server-routes - Reading time: 12 min --- Nuxt Nitro, frontend bileşenlerinin yanı sıra API routes, middleware ve sunucu tarafı mantığını yöneten evrensel bir sunucu motoru sağlayarak Vue uygulamalarını tam teşekküllü full-stack çözümlere dönüştürür. Nuxt 4.3 ve yaklaşan Nitro v3 ile production-ready backend'ler oluşturmak, Vue geliştirme süreciyle hiç bu kadar entegre olmamıştı. > **Tek Repoda Full-Stack** > > Nitro, frontend ve backend arasında TypeScript tiplerinin paylaşılmasını sağlayarak API kontrat tutarsızlıklarını ortadan kaldırır ve boilerplate kodunu azaltır. Server routes `server/api/` içinde bulunur ve otomatik olarak `/api/*` endpoints olarak erişilebilir hale gelir. ## Nuxt Nitro Server Engine Mimarisi Nitro, Nuxt'un server dizinini güçlendiren evrensel JavaScript sunucu çalışma zamanı olarak görev yapar. Geleneksel Node.js sunucularından farklı olarak Nitro, kod değişikliği gerektirmeden [Vercel](https://vercel.com/docs/frameworks/nuxt), [Netlify](https://docs.netlify.com/frameworks/nuxt/), Cloudflare Workers ve standart Node.js ortamlarına sorunsuzca deploy edilen platforma özgü optimize edilmiş bundle'lar oluşturur. Mimari, dizin kuralları aracılığıyla sorumlulukları ayırır: ```typescript // server/api/users.get.ts export default defineEventHandler(async (event) => { // Nitro auto-serializes return values to JSON // HTTP method suffix (.get.ts) restricts to GET requests const users = await getUsersFromDatabase() return { users, count: users.length } }) ``` Nitro dört dizini tarar: `/api` öneki ile API routes için `server/api`, önek olmadan routes için `server/routes`, istek interceptor'ları için `server/middleware` ve paylaşılan sunucu yardımcı programları için `server/utils`. Bu dizinlerin dışındaki dosyalar sunucu çalışma zamanı tarafından görülmez. ## defineEventHandler ile RESTful API Endpoints Oluşturma Server routes, dosya adlarının doğrudan URL yollarına eşlendiği dosya tabanlı routing kurallarını takip eder. HTTP method son ekleri, her handler'ın hangi istekleri kabul edeceğini kontrol eder. ```typescript // server/api/products/[id].get.ts // Handles GET /api/products/123 export default defineEventHandler(async (event) => { // Extract route parameter from URL const id = getRouterParam(event, 'id') if (!id) { throw createError({ status: 400, // Nuxt 4 uses Web API naming (not statusCode) statusText: 'Product ID required' // Not statusMessage }) } const product = await fetchProduct(id) if (!product) { throw createError({ status: 404, statusText: 'Product not found' }) } return product }) ``` Nuxt 4, Nitro v3'e hazırlık olarak Web API adlandırma kurallarını benimser. `statusCode` özelliği `status` olur ve `statusMessage` da `statusText` olur. Eski özellikler hala çalışsa da, yeni adlandırmaya geçiş Nuxt 5 ile uyumluluğu sağlar. Body doğrulaması ile POST isteklerinin işlenmesi: ```typescript // server/api/products/index.post.ts // Handles POST /api/products import { z } from 'zod' const ProductSchema = z.object({ name: z.string().min(1).max(200), price: z.number().positive(), category: z.enum(['electronics', 'clothing', 'food']) }) export default defineEventHandler(async (event) => { // readBody automatically parses JSON const body = await readBody(event) // Validate with Zod schema const result = ProductSchema.safeParse(body) if (!result.success) { throw createError({ status: 422, statusText: 'Validation failed', data: result.error.flatten() }) } const product = await createProduct(result.data) // Set 201 Created status for resource creation setResponseStatus(event, 201) return product }) ``` ## Kimlik Doğrulama ve Loglama için Server Middleware Middleware dosyaları route handler'lardan önce çalışarak kimlik doğrulama, loglama ve istek dönüştürme gibi kesişen konuların ele alınmasını sağlar. Route handler'lardan farklı olarak, middleware doğrudan yanıt döndürmez. ```typescript // server/middleware/auth.ts export default defineEventHandler(async (event) => { // Skip auth for public routes const publicRoutes = ['/api/health', '/api/auth/login'] if (publicRoutes.includes(event.path)) { return // Continue to next handler } const authHeader = getHeader(event, 'authorization') if (!authHeader?.startsWith('Bearer ')) { throw createError({ status: 401, statusText: 'Authentication required' }) } const token = authHeader.slice(7) try { // Verify JWT and attach user to event context const user = await verifyToken(token) event.context.user = user } catch { throw createError({ status: 401, statusText: 'Invalid or expired token' }) } }) ``` `event.context` nesnesi, tek bir istek içinde middleware ve handler'lar arasında kalıcıdır ve veri paylaşımı için tip güvenli bir yol sağlar. Context tiplerini bir declaration dosyasında tanımlayın: ```typescript // server/types/context.d.ts declare module 'h3' { interface H3EventContext { user?: { id: string email: string role: 'admin' | 'user' } } } ``` Nuxt sunucu kavramları üzerine mülakat hazırlığı için [Nuxt Server Routes mülakat soruları](/technologies/vue-nuxt/interview-questions/nuxt-server-routes) modülünü inceleyebilirsiniz. ## Prisma ve Server Utils ile Veritabanı Entegrasyonu `server/utils/` içindeki sunucu yardımcı programları, tüm sunucu kodunda otomatik olarak import edilir ve veritabanı istemcileri ile paylaşılan mantığı açık import'lar olmadan erişilebilir kılar. ```typescript // server/utils/db.ts import { PrismaClient } from '@prisma/client' // Singleton pattern prevents multiple instances in development const globalForPrisma = globalThis as unknown as { prisma: PrismaClient | undefined } export const prisma = globalForPrisma.prisma ?? new PrismaClient({ log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'] }) if (process.env.NODE_ENV !== 'production') { globalForPrisma.prisma = prisma } ``` Veritabanı istemcisi global olarak erişilebilir olduğunda, route handler'ları ona doğrudan erişir: ```typescript // server/api/posts/index.get.ts export default defineEventHandler(async (event) => { // Query parameters for pagination const query = getQuery(event) const page = Number(query.page) || 1 const limit = Math.min(Number(query.limit) || 10, 100) const skip = (page - 1) * limit // Parallel queries for data and count const [posts, total] = await Promise.all([ prisma.post.findMany({ skip, take: limit, orderBy: { createdAt: 'desc' }, include: { author: { select: { name: true, avatar: true } } } }), prisma.post.count() ]) return { posts, pagination: { page, limit, total, pages: Math.ceil(total / limit) } } }) ``` ## Runtime Başlatma için Server Plugins `server/plugins/` içindeki sunucu plugin'leri, sunucu başladığında bir kez çalışır ve bağlantıların başlatılması, görevlerin zamanlanması veya izlemenin kurulması için idealdir. ```typescript // server/plugins/database.ts export default defineNitroPlugin(async (nitroApp) => { // Verify database connection on startup try { await prisma.$connect() console.log('Database connected successfully') } catch (error) { console.error('Database connection failed:', error) process.exit(1) // Fail fast if DB unavailable } // Graceful shutdown hook nitroApp.hooks.hook('close', async () => { await prisma.$disconnect() console.log('Database disconnected') }) }) ``` Plugin sistemi, yaşam döngüsü yönetimi için [Nitro hook'ları](https://nitro.unjs.io/guide/plugins) ile entegre olur. Hook'lar belirli noktalarda tetiklenir: işleme öncesi `request`, gönderme öncesi `beforeResponse` ve kapatma sırasında `close`. ## Vue Bileşenlerinden Tip Güvenli API Çağrıları Nuxt'un `$fetch` yardımcı programı, `~/server` alias'ı kullanıldığında sunucu route'larından tip çıkarımı sağlar. [useFetch composable](/technologies/vue-nuxt/interview-questions/nuxt-data-fetching) ile birleştirildiğinde, bileşenler tam TypeScript desteği ile API'leri tüketir. ```vue ``` ## Server Routes için Önbellekleme Stratejileri Nuxt 4.3, `nuxt.config.ts` içindeki `routeRules` aracılığıyla geliştirilmiş önbellekleme kontrolleri sunar. Server routes, sayfalarla aynı önbellekleme altyapısından yararlanır. ```typescript // nuxt.config.ts export default defineNuxtConfig({ routeRules: { // Cache product listings for 5 minutes '/api/products': { cache: { maxAge: 300, staleMaxAge: 600, // Serve stale while revalidating swr: true } }, // No cache for user-specific data '/api/user/**': { cache: false }, // Pre-render static API responses at build time '/api/categories': { prerender: true } } }) ``` Dinamik önbellek geçersiz kılma için `defineCachedEventHandler` wrapper'ını kullanın: ```typescript // server/api/trending.get.ts export default defineCachedEventHandler(async (event) => { const trending = await calculateTrendingProducts() return trending }, { maxAge: 60 * 5, // 5 minutes name: 'trending-products', getKey: () => 'trending', // Cache key for invalidation shouldBypassCache: (event) => { // Bypass for admin users return event.context.user?.role === 'admin' } }) ``` ## Hata Yönetimi ve Yanıt Biçimlendirme Tutarlı hata yanıtları API kullanılabilirliğini artırır. Paylaşılan bir hata işleme yardımcı programı oluşturun: ```typescript // server/utils/errors.ts import { H3Error } from 'h3' export function handleDatabaseError(error: unknown): never { console.error('Database error:', error) // Prisma-specific error handling if (error instanceof Error && 'code' in error) { const prismaError = error as { code: string } if (prismaError.code === 'P2002') { throw createError({ status: 409, statusText: 'Resource already exists' }) } if (prismaError.code === 'P2025') { throw createError({ status: 404, statusText: 'Resource not found' }) } } throw createError({ status: 500, statusText: 'Internal server error' }) } ``` Kapsamlı Vue.js kalıpları ve state yönetimi için [Pinia vs Vuex karşılaştırması](/blog/vue-nuxt/vue-3-pinia-vs-vuex-state-management) makalesine göz atabilirsiniz. > **Production Kontrol Listesi** > > Nitro sunucularını deploy etmeden önce: Zod şemalarıyla ortam değişkenlerini doğrulayın, rate limiting middleware uygulayın, debugging için istek loglama ekleyin ve cross-origin API erişimi için CORS header'larını yapılandırın. ## Farklı Platformlara Deployment Nitro'nun preset sistemi her platform için optimize edilmiş build'ler oluşturur: ```typescript // nuxt.config.ts export default defineNuxtConfig({ nitro: { // Auto-detected on Vercel/Netlify, or specify manually preset: 'node-server', // 'vercel', 'netlify', 'cloudflare-workers' // Compress responses compressPublicAssets: true, // External packages not to bundle externals: { external: ['@prisma/client'] } } }) ``` Node.js deployment'ları için çıktı bağımsız bir sunucu içerir: ```bash # Build for production npm run build # Start the server node .output/server/index.mjs ``` > **Nuxt 3 Destek Sonu** > > Nuxt 3, 31 Temmuz 2026'da destek süresini tamamlıyor. Projeler [resmi geçiş kılavuzunu](https://nuxt.com/docs/getting-started/upgrade) kullanarak Nuxt 4'e geçiş yapmalıdır. Nitro v3 ile Nuxt 5 kısa süre sonra takip edecektir. ## Sonuç - `server/api/` içindeki Server routes, HTTP method son ekleri (`.get.ts`, `.post.ts`) ile istek türlerini kontrol ederek otomatik olarak `/api/*` endpoint'lerine eşlenir - `server/middleware/` içindeki Middleware, route'lar çalıştırılmadan önce kimlik doğrulama, loglama ve istek dönüşümünü yönetir - `event.context` nesnesi, bir istek içinde middleware ve handler'lar arasında tipli veri paylaşır - `server/utils/` içindeki sunucu yardımcı programları, veritabanı istemcileri ve paylaşılan mantık için ideal olarak sunucu kodunda otomatik import edilir - Nuxt 4, Nitro v3'e hazırlık olarak Web API adlandırmasını (`status`/`statusText`) benimser - `defineCachedEventHandler`, geçersiz kılma kontrolleri ile route düzeyinde önbellekleme sağlar - Nitro preset'leri, Vercel, Netlify, Cloudflare ve Node.js sunucularına sıfır konfigürasyonla deployment sağlar --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/tr/blog/vue-nuxt/nuxt-nitro-server-routes-2026