What if you could skip writing fetch calls and still run server code safely and easily?
API routes vs server actions decision in NextJS - When to Use Which
Start learning this pattern below
Jump into concepts and practice - no test required
Imagine building a web app where you manually write separate server endpoints and client code to fetch data, then handle all the communication and state updates yourself.
This manual approach is slow, error-prone, and leads to duplicated code. You must manage API endpoints, fetch calls, and data syncing, which can easily break or get out of sync.
Next.js API routes and server actions let you write server logic close to your components, simplifying data fetching and mutations with less code and fewer mistakes.
fetch('/api/data').then(res => res.json()).then(data => setState(data))const data = await serverAction(); // call server logic directly
This decision empowers you to build faster, cleaner apps by choosing the best way to handle server logic and data flow seamlessly.
For example, when submitting a form, you can either call an API route or use a server action to process data without writing extra fetch code.
Manual API handling is complex and error-prone.
API routes and server actions simplify server-client communication.
Choosing the right method improves app speed and code clarity.
Practice
Solution
Step 1: Understand API routes purpose
API routes create separate API endpoints that the client can call to communicate with the server.Step 2: Understand server actions purpose
Server actions allow calling server code directly from React components without creating separate endpoints.Final Answer:
API routes create separate endpoints; server actions call server code directly from components. -> Option CQuick Check:
API routes vs server actions difference = D [OK]
- Thinking API routes run on client side
- Confusing server actions with styling or routing
- Believing API routes and server actions are identical
Solution
Step 1: Identify server action syntax
Server actions are defined as exported async functions that run on the server.Step 2: Compare with API route syntax
API routes use a default export function with (req, res) parameters, not named async functions.Final Answer:
export async function actionName() { /* server code */ } -> Option BQuick Check:
Server action syntax = B [OK]
- Using default export with req, res (API route style)
- Writing server actions as React components
- Calling fetch inside server action definition
export async function addNumbers(a, b) {
return a + b;
}Solution
Step 1: Analyze the server action function
The function is async and returns the sum of a and b, which is a number.Step 2: Understand async function return
Async functions return a Promise that resolves to the returned value, here the sum.Final Answer:
Returns a Promise resolving to the sum of a and b. -> Option AQuick Check:
Async function returns Promise with sum = A [OK]
- Thinking server actions cannot return values
- Confusing number addition with string concatenation
- Assuming syntax error due to parameters
export async function handler(req, res) {
res.status(200).json({ message: 'Hello' });
}What is the error and how to fix it?
Solution
Step 1: Identify API route export requirement
API routes require a default export function to handle requests.Step 2: Fix export statement
Change named export to default export:export default async function handler(req, res).Final Answer:
Missing default export; change toexport default async function handler(req, res). -> Option DQuick Check:
API route default export required = C [OK]
- Using named export instead of default export
- Confusing API routes with server actions syntax
- Incorrect response method usage
Solution
Step 1: Analyze app needs
The app requires a public API accessible by multiple clients and simple server logic integrated with components.Step 2: Match features to approaches
API routes are best for broad public APIs; server actions are ideal for simple, direct server calls from components.Final Answer:
Use API routes for the public API and server actions for simple server logic inside components. -> Option AQuick Check:
Public API + integrated logic = A [OK]
- Using only server actions for public APIs
- Using only API routes for simple component logic
- Avoiding server code when needed
