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
Dynamic API Routes in Next.js
📖 Scenario: You are building a simple Next.js API that returns user information based on a user ID provided in the URL. This is common when you want to fetch data dynamically for different users.
🎯 Goal: Create a dynamic API route in Next.js that reads the userId from the URL and returns a JSON response with the user's details.
📋 What You'll Learn
Create a data object with user details keyed by user IDs
Add a variable to hold the user ID parameter from the request
Write the API handler function that returns user data based on the user ID
Export the API handler as default from the dynamic route file
💡 Why This Matters
🌍 Real World
Dynamic API routes let you build flexible backend endpoints that respond to different inputs in the URL, such as user profiles, product details, or blog posts.
💼 Career
Understanding dynamic API routes is essential for building modern web applications with Next.js, enabling you to create scalable and maintainable server-side logic.
Progress0 / 4 steps
1
Create user data object
Create a constant object called users with these exact entries: '1': { name: 'Alice', age: 25 }, '2': { name: 'Bob', age: 30 }, and '3': { name: 'Charlie', age: 35 }.
NextJS
Hint
Use a JavaScript object with string keys for user IDs and objects for user details.
2
Get userId from request query
Add a constant called userId that extracts userId from req.query inside the API handler function.
NextJS
Hint
Use object destructuring to get userId from req.query.
3
Return user data or 404
Inside the handler function, write code that checks if users[userId] exists. If yes, respond with status 200 and JSON of the user data. If not, respond with status 404 and JSON message { error: 'User not found' }.
NextJS
Hint
Use if to check user existence and res.status().json() to send responses.
4
Export the handler as default
Ensure the API handler function is exported as the default export from the file using export default function handler(req, res) { ... }.
NextJS
Hint
The function must be exported as default for Next.js API routing to work.
Practice
(1/5)
1. What is the purpose of using square brackets in Next.js API route filenames like [id].js?
easy
A. To create dynamic API routes that capture parts of the URL
B. To mark the file as a static API route
C. To import external modules dynamically
D. To define middleware for the API route
Solution
Step 1: Understand file naming in Next.js API routes
Square brackets in filenames like [id].js indicate a dynamic segment in the URL path.
Step 2: Recognize the effect on routing
This allows the API route to capture the value in that part of the URL and use it inside the handler.
Final Answer:
To create dynamic API routes that capture parts of the URL -> Option A
Quick Check:
Dynamic routes use brackets = D [OK]
Hint: Square brackets in filenames mean dynamic URL parts [OK]
Common Mistakes:
Thinking brackets mark static routes
Confusing with dynamic imports
Assuming brackets define middleware
2. Which of the following is the correct way to access the dynamic parameter id inside a Next.js API route handler in [id].js?
easy
A. const id = req.params.id;
B. const id = req.body.id;
C. const id = req.query.id;
D. const id = req.route.id;
Solution
Step 1: Recall how Next.js passes dynamic route params
Next.js provides dynamic route parameters inside req.query in API routes.
Step 2: Identify the correct syntax
Accessing id is done by req.query.id, not req.params or others.
Final Answer:
const id = req.query.id; -> Option C
Quick Check:
Dynamic params in API routes = req.query [OK]
Hint: Use req.query to get dynamic route params in Next.js API [OK]
Common Mistakes:
Using req.params instead of req.query
Trying to get params from req.body
Using incorrect property like req.route
3. Given the API route file pages/api/user/[userId].js with this handler:
export default function handler(req, res) {
const { userId } = req.query;
res.status(200).json({ message: `User ID is ${userId}` });
}
What will be the JSON response when a client requests /api/user/42?
medium
A. 404 Not Found
B. {"message":"User ID is userId"}
C. {"message":"User ID is undefined"}
D. {"message":"User ID is 42"}
Solution
Step 1: Extract dynamic parameter from URL
The URL /api/user/42 matches the dynamic route [userId].js, so userId is "42".
Step 2: Check the handler response
The handler reads userId from req.query and returns JSON with message including that value.
Final Answer:
{"message":"User ID is 42"} -> Option D
Quick Check:
Dynamic param value used in response = A [OK]
Hint: Dynamic param in URL becomes req.query value [OK]
Common Mistakes:
Expecting literal string 'userId' instead of value
Assuming undefined if param missing
Thinking route returns 404 for dynamic routes
4. Consider this Next.js API route file named pages/api/product/[pid].js with the handler:
export default function handler(req, res) {
const pid = req.query.pid;
if (!pid) {
res.status(400).json({ error: "Product ID missing" });
}
res.status(200).json({ productId: pid });
}
What is the bug in this code?
medium
A. It should use res.send instead of res.json
B. It does not return after sending 400 response, causing headers to be sent twice
C. It uses req.query.pid instead of req.params.pid
D. The file name should be [pid].ts instead of .js
Solution
Step 1: Analyze the conditional response
If pid is missing, the code sends a 400 response but does not stop execution.
Step 2: Understand HTTP response behavior
Without a return after sending 400, the code continues and tries to send a 200 response, causing an error.
Final Answer:
It does not return after sending 400 response, causing headers to be sent twice -> Option B
Quick Check:
Return after error response to avoid double send [OK]
Hint: Always return after sending error response in API handlers [OK]
Common Mistakes:
Ignoring missing return after res.status(400).json()
Confusing req.query with req.params
Thinking res.send is required over res.json
5. You want to create a Next.js API route that handles multiple dynamic segments like /api/order/[orderId]/item/[itemId].js. How should you structure the files and access both orderId and itemId inside the handler?
hard
A. Create nested folders: pages/api/order/[orderId]/item/[itemId].js and access via req.query.orderId and req.query.itemId
B. Create a single file pages/api/order-item.js and parse URL manually
C. Use query parameters like /api/order?orderId=1&itemId=2 and access req.query
D. Create a file pages/api/order/[orderId]-[itemId].js and access req.query as an array
Solution
Step 1: Understand nested dynamic routes in Next.js
Next.js supports nested folders with dynamic segments using square brackets for each segment.
Step 2: Access multiple dynamic params in handler
Both orderId and itemId appear in req.query as separate keys.
Final Answer:
Create nested folders: pages/api/order/[orderId]/item/[itemId].js and access via req.query.orderId and req.query.itemId -> Option A
Quick Check:
Nested folders with brackets = multiple params in req.query [OK]
Hint: Use nested folders with brackets for multiple dynamic params [OK]
Common Mistakes:
Trying to parse multiple params in one filename
Using query string instead of dynamic routes
Assuming req.query returns array for multiple params