Server routes let your app talk to a server to get or send data. APIs are like menus that show what data you can ask for or send.
Server routes and API in Vue
import { defineEventHandler } from 'h3' export default defineEventHandler(async (event) => { // Your code to handle the request return { message: 'Hello from API' } })
This example shows a simple server route handler in a Vue 3 + Nitro environment (like Nuxt 3).
Server routes are placed in the server/api folder and automatically become API endpoints.
export default defineEventHandler(() => { return { greeting: 'Hi there!' } })
import { readBody } from 'h3' export default defineEventHandler(async (event) => { const body = await readBody(event) return { received: body } })
export default defineEventHandler(() => { return { time: new Date().toISOString() } })
This server route handles POST requests. It reads the JSON body sent by the client, extracts the name field, and replies with a greeting message. If the request is not POST, it tells the client what to do.
import { defineEventHandler, readBody } from 'h3' export default defineEventHandler(async (event) => { if (event.node.req.method === 'POST') { const data = await readBody(event) return { message: `Hello, ${data.name}!` } } return { message: 'Send a POST request with { name } in JSON.' } })
Server routes run only on the server, so you can safely handle secrets or database calls here.
Use readBody(event) to get data sent by the client in POST or PUT requests.
Server routes in Vue/Nuxt are automatically available based on their file path under server/api.
Server routes let your app communicate with backend logic and data.
APIs define how your frontend and backend talk using requests and responses.
In Vue with Nitro, server routes are simple functions that handle requests and return JSON.
Practice
Solution
Step 1: Understand server routes role
Server routes act as backend endpoints that receive requests from the frontend.Step 2: Identify their function in Vue Nitro
They process these requests and return data or responses, enabling communication between frontend and backend.Final Answer:
To handle backend requests and send responses -> Option BQuick Check:
Server routes = backend communication [OK]
- Confusing server routes with frontend styling
- Thinking server routes manage only client state
- Assuming server routes create animations
Solution
Step 1: Recognize Nitro server route syntax
In Vue Nitro, server routes export a default function using defineEventHandler that returns data.Step 2: Check each option
export default defineEventHandler(() => { return { message: 'Hello' } }) uses defineEventHandler and returns an object, which is correct. Others either lack export, use wrong syntax, or are not Nitro style.Final Answer:
export default defineEventHandler(() => { return { message: 'Hello' } }) -> Option CQuick Check:
Use defineEventHandler for Nitro routes [OK]
- Missing export default
- Not using defineEventHandler
- Using Express.js style instead of Nitro
export default defineEventHandler(() => { return { status: 'ok', count: 5 } })What will the frontend receive when calling this API?
Solution
Step 1: Analyze the returned object
The route returns an object with keys status and count, so the response is JSON with those values.Step 2: Understand Nitro response behavior
Nitro automatically serializes the returned object to JSON for the frontend.Final Answer:
{ status: 'ok', count: 5 } -> Option DQuick Check:
Returned object = JSON response [OK]
- Expecting string concatenation
- Thinking await is needed for sync return
- Assuming undefined if no explicit JSON
export default () => { return { message: 'Hi' } }Solution
Step 1: Check Nitro route requirements
Vue Nitro requires server routes to export a default function wrapped with defineEventHandler.Step 2: Identify missing part
The code exports a function but does not use defineEventHandler, so it won't work as a proper Nitro route.Final Answer:
Missing defineEventHandler wrapper -> Option AQuick Check:
Always wrap route with defineEventHandler [OK]
- Forgetting defineEventHandler
- Thinking return must be string
- Confusing export default rules
Solution
Step 1: Understand query access in Nitro
Vue Nitro provides a helper getQuery(event) to safely get query parameters from the request.Step 2: Check each option for correct query usage
export default defineEventHandler(event => { const role = getQuery(event).role; return users.filter(u => u.role === role) }) uses getQuery(event).role correctly. export default defineEventHandler(event => { const role = event.node.req.url.split('role=')[1]; return users.filter(u => u.role === role) }) manually parses URL which is error-prone. export default defineEventHandler(() => { return users }) ignores query. export default defineEventHandler(event => { const role = event.query.role; return users.filter(u => u.role === role) }) uses event.query which is not standard.Final Answer:
export default defineEventHandler(event => { const role = getQuery(event).role; return users.filter(u => u.role === role) }) -> Option AQuick Check:
Use getQuery(event) to read query params [OK]
- Parsing URL manually instead of getQuery
- Using event.query which is undefined
- Ignoring query parameters
Ready to prove it?
Pass the test and this pattern moves unknown
