Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Server-side error handling
📖 Scenario: You are building a Next.js API route that fetches user data from a database. Sometimes the database might fail or the user might not exist. You want to handle these errors gracefully on the server side so the client gets clear error messages.
🎯 Goal: Create a Next.js API route that fetches user data by ID and handles errors like missing users or server failures using proper server-side error handling.
📋 What You'll Learn
Create a mock user data object with exact user entries
Add a variable for the user ID to fetch
Write a server-side function to fetch user data and handle errors with try/catch
Return proper HTTP status codes and JSON error messages in the API response
💡 Why This Matters
🌍 Real World
Server-side error handling is essential in web apps to provide clear feedback to clients and avoid crashes when data is missing or servers fail.
💼 Career
Understanding how to handle errors in Next.js API routes is a key skill for backend and full-stack developers working with React and Next.js frameworks.
Progress0 / 4 steps
1
DATA SETUP: Create mock user data
Create a constant object called users with these exact entries: '1': { name: 'Alice', age: 30 }, '2': { name: 'Bob', age: 25 }, and '3': { name: 'Charlie', age: 35 }.
NextJS
Hint
Use a constant object named users with keys as strings '1', '2', '3' and values as objects with name and age.
2
CONFIGURATION: Define the user ID to fetch
Create a constant called userId and set it to the string '2' to specify which user to fetch.
NextJS
Hint
Define userId as a string with value '2'.
3
CORE LOGIC: Write server-side function with error handling
Write an async function called getUserData that takes id as a parameter. Inside, use a try/catch block. In try, if users[id] does not exist, throw an error with message 'User not found'. Otherwise, return users[id]. In catch, rethrow the error.
NextJS
Hint
Use async function getUserData(id) with try/catch. Throw error if user missing, else return user.
4
COMPLETION: Create Next.js API route with error responses
Export an async default function called handler that takes req and res. Inside, use try/catch. In try, call getUserData(userId) and respond with res.status(200).json(user). In catch, if error message is 'User not found', respond with res.status(404).json({ error: 'User not found' }). Otherwise, respond with res.status(500).json({ error: 'Server error' }).
NextJS
Hint
Use export default async function handler(req, res) with try/catch. Return 200 with user or 404/500 with error JSON.
Practice
(1/5)
1. What is the main purpose of using try...catch blocks in Next.js server-side functions?
easy
A. To style components dynamically
B. To catch and handle errors gracefully during server-side execution
C. To improve client-side rendering speed
D. To manage user authentication on the client
Solution
Step 1: Understand server-side error handling
Server-side functions can fail due to unexpected issues. Using try...catch helps catch these errors.
Step 2: Purpose of try...catch
The try block runs code that might fail, and the catch block handles errors to prevent crashes and provide feedback.
Final Answer:
To catch and handle errors gracefully during server-side execution -> Option B
Quick Check:
Error handling = catch errors gracefully [OK]
Hint: Try-catch blocks catch errors on the server side [OK]
Common Mistakes:
Confusing client-side and server-side error handling
Thinking try-catch improves UI styling
Assuming try-catch speeds up rendering
2. Which of the following is the correct syntax to catch errors in a Next.js server function?
Hint: Remember: try then catch with parentheses [OK]
Common Mistakes:
Using incorrect keywords like except or handle
Swapping try and catch blocks
Omitting parentheses after catch
3. Consider this Next.js server function snippet:
export async function GET() {
try {
throw new Error('Failed to fetch data');
} catch (error) {
return new Response(error.message, { status: 500 });
}
}
What will be the HTTP status code returned when this function runs?
medium
A. 400
B. 404
C. 200
D. 500
Solution
Step 1: Analyze the thrown error
The function throws an error with message 'Failed to fetch data'.
Step 2: Check the catch block response
The catch block returns a Response with status 500, indicating a server error.
Final Answer:
500 -> Option D
Quick Check:
Server error status code = 500 [OK]
Hint: Error caught returns status 500 by default [OK]
Common Mistakes:
Assuming status 200 despite error
Confusing 404 (not found) with server error
Ignoring the status property in Response
4. Identify the error in this Next.js server function code:
export async function GET() {
try {
const data = await fetch('https://api.example.com/data');
return new Response(JSON.stringify(data));
} catch (error) {
return new Response('Error occurred', { status: 500 });
}
}
medium
A. Not parsing fetch response to JSON before stringifying
B. Missing await on fetch call
C. Incorrect status code in catch block
D. No error handling implemented
Solution
Step 1: Understand fetch response handling
The fetch call returns a Response object, not the actual data. We must call response.json() to parse it.
Step 2: Identify missing JSON parsing
The code stringifies the Response object directly without parsing JSON, which is incorrect.
Final Answer:
Not parsing fetch response to JSON before stringifying -> Option A
Quick Check:
Parse response.json() before JSON.stringify() [OK]
Hint: Always parse fetch response with .json() before use [OK]
Common Mistakes:
Stringifying the Response object directly
Forgetting to await response.json()
Assuming fetch returns JSON data directly
5. You want to create a Next.js server function that fetches user data and returns a 404 status if the user is not found, or a 500 status if the fetch fails. Which code snippet correctly implements this error handling?
hard
A. export async function GET() {
try {
const res = await fetch('https://api.example.com/user');
if (!res.ok) {
if (res.status === 404) return new Response('User not found', { status: 404 });
throw new Error('Fetch failed');
}
const user = await res.json();
return new Response(JSON.stringify(user));
} catch {
return new Response('Server error', { status: 500 });
}
}
B. export async function GET() {
const res = await fetch('https://api.example.com/user');
if (res.status === 404) return new Response('User not found', { status: 404 });
const user = await res.json();
return new Response(JSON.stringify(user));
}
C. export async function GET() {
try {
const user = await fetch('https://api.example.com/user').json();
return new Response(JSON.stringify(user));
} catch (error) {
return new Response('User not found', { status: 404 });
}
}
D. export async function GET() {
try {
const res = await fetch('https://api.example.com/user');
const user = await res.json();
return new Response(JSON.stringify(user));
} catch {
return new Response('User not found', { status: 404 });
}
}
Solution
Step 1: Check for HTTP errors explicitly
export async function GET() {
try {
const res = await fetch('https://api.example.com/user');
if (!res.ok) {
if (res.status === 404) return new Response('User not found', { status: 404 });
throw new Error('Fetch failed');
}
const user = await res.json();
return new Response(JSON.stringify(user));
} catch {
return new Response('Server error', { status: 500 });
}
} checks res.ok and handles 404 with a specific response, throwing errors for other failures.
Step 2: Use try-catch for fetch failures
The catch block returns a 500 status for server errors, correctly distinguishing error types.
Final Answer:
Correctly handles 404 if the user is not found and 500 if the fetch fails -> Option A
Quick Check:
Check res.ok and catch errors for 404 and 500 [OK]
Hint: Check res.ok and catch errors separately for 404 and 500 [OK]