Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Nuxt 3.x reference covering SSR, file-based routing, auto-imports, server routes, and Nitro deployment.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/features-server.md
1---2name: server-routes3description: API routes, server middleware, and Nitro server engine in Nuxt4---56# Server Routes78Nuxt includes Nitro server engine for building full-stack applications with API routes and server middleware.910## API Routes1112Create files in `server/api/` directory:1314```ts15// server/api/hello.ts16export default defineEventHandler((event) => {17return { message: 'Hello World' }18})19```2021Access at `/api/hello`.2223### HTTP Methods2425```ts26// server/api/users.get.ts - GET /api/users27export default defineEventHandler(() => {28return getUsers()29})3031// server/api/users.post.ts - POST /api/users32export default defineEventHandler(async (event) => {33const body = await readBody(event)34return createUser(body)35})3637// server/api/users/[id].put.ts - PUT /api/users/:id38export default defineEventHandler(async (event) => {39const id = getRouterParam(event, 'id')40const body = await readBody(event)41return updateUser(id, body)42})4344// server/api/users/[id].delete.ts - DELETE /api/users/:id45export default defineEventHandler((event) => {46const id = getRouterParam(event, 'id')47return deleteUser(id)48})49```5051### Route Parameters5253```ts54// server/api/posts/[id].ts55export default defineEventHandler((event) => {56const id = getRouterParam(event, 'id')57return getPost(id)58})5960// Catch-all: server/api/[...path].ts61export default defineEventHandler((event) => {62const path = getRouterParam(event, 'path')63return { path }64})65```6667### Query Parameters6869```ts70// server/api/search.ts71// GET /api/search?q=nuxt&page=172export default defineEventHandler((event) => {73const query = getQuery(event)74// { q: 'nuxt', page: '1' }75return search(query.q, Number(query.page))76})77```7879### Request Body8081```ts82// server/api/submit.post.ts83export default defineEventHandler(async (event) => {84const body = await readBody(event)85// Validate and process body86return { success: true, data: body }87})88```8990### Headers and Cookies9192```ts93// server/api/auth.ts94export default defineEventHandler((event) => {95// Read headers96const auth = getHeader(event, 'authorization')9798// Read cookies99const cookies = parseCookies(event)100const token = getCookie(event, 'token')101102// Set headers103setHeader(event, 'X-Custom-Header', 'value')104105// Set cookies106setCookie(event, 'token', 'new-token', {107httpOnly: true,108secure: true,109maxAge: 60 * 60 * 24, // 1 day110})111112return { authenticated: !!token }113})114```115116## Server Middleware117118Runs on every request before routes:119120```ts121// server/middleware/auth.ts122export default defineEventHandler((event) => {123const token = getCookie(event, 'token')124125// Attach data to event context126event.context.user = token ? verifyToken(token) : null127})128129// server/middleware/log.ts130export default defineEventHandler((event) => {131console.log(`${event.method} ${event.path}`)132})133```134135Access context in routes:136137```ts138// server/api/profile.ts139export default defineEventHandler((event) => {140const user = event.context.user141if (!user) {142throw createError({ statusCode: 401, message: 'Unauthorized' })143}144return user145})146```147148## Error Handling149150```ts151// server/api/users/[id].ts152export default defineEventHandler((event) => {153const id = getRouterParam(event, 'id')154const user = findUser(id)155156if (!user) {157throw createError({158statusCode: 404,159statusMessage: 'User not found',160})161}162163return user164})165```166167## Server Utils168169Auto-imported in `server/utils/`:170171```ts172// server/utils/db.ts173export function useDb() {174return createDbConnection()175}176```177178```ts179// server/api/users.ts180export default defineEventHandler(() => {181const db = useDb() // Auto-imported182return db.query('SELECT * FROM users')183})184```185186## Server Plugins187188Run once when server starts:189190```ts191// server/plugins/db.ts192export default defineNitroPlugin((nitroApp) => {193// Initialize database connection194const db = createDbConnection()195196// Add to context197nitroApp.hooks.hook('request', (event) => {198event.context.db = db199})200})201```202203## Streaming Responses204205```ts206// server/api/stream.ts207export default defineEventHandler((event) => {208setHeader(event, 'Content-Type', 'text/event-stream')209setHeader(event, 'Cache-Control', 'no-cache')210setHeader(event, 'Connection', 'keep-alive')211212const stream = new ReadableStream({213async start(controller) {214for (let i = 0; i < 10; i++) {215controller.enqueue(`data: ${JSON.stringify({ count: i })}\n\n`)216await new Promise(r => setTimeout(r, 1000))217}218controller.close()219},220})221222return stream223})224```225226## Server Storage227228Key-value storage with multiple drivers:229230```ts231// server/api/cache.ts232export default defineEventHandler(async (event) => {233const storage = useStorage()234235// Set value236await storage.setItem('key', { data: 'value' })237238// Get value239const data = await storage.getItem('key')240241return data242})243```244245Configure storage drivers in `nuxt.config.ts`:246247```ts248export default defineNuxtConfig({249nitro: {250storage: {251redis: {252driver: 'redis',253url: 'redis://localhost:6379',254},255},256},257})258```259260<!--261Source references:262- https://nuxt.com/docs/getting-started/server263- https://nuxt.com/docs/directory-structure/server264- https://nitro.build/guide265-->266