Dynamic API routes let your app handle many similar requests using one route. This saves time and keeps your code neat.
Dynamic API routes in NextJS
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
NextJS
/pages/api/[param].js
Use square brackets [param] in the file name to mark a dynamic part.
The dynamic part is available in the handler as req.query.param.
Examples
/api/user/123 and returns the user ID.NextJS
// File: /pages/api/user/[id].js export default function handler(req, res) { const { id } = req.query; res.status(200).json({ message: `User ID is ${id}` }); }
NextJS
// File: /pages/api/product/[code].js export default function handler(req, res) { const { code } = req.query; res.status(200).json({ productCode: code }); }
/api/blog/2024/06/nextjs.NextJS
// File: /pages/api/blog/[...slug].js export default function handler(req, res) { const { slug } = req.query; res.status(200).json({ slug }); }
Sample Program
This API route greets the user by the ID from the URL. For example, calling /api/user/42 returns a greeting with 42.
NextJS
// File: /pages/api/user/[id].js export default function handler(req, res) { const { id } = req.query; res.status(200).json({ message: `Hello, user ${id}!` }); }
Important Notes
Dynamic routes let you write one handler for many URLs.
Use req.query to get the dynamic parts from the URL.
Catch-all routes use [...param] to capture multiple URL segments.
Summary
Dynamic API routes use square brackets in file names to capture URL parts.
You access these parts inside the handler with req.query.
This helps keep your API code simple and flexible.
Practice
1. What is the purpose of using square brackets in Next.js API route filenames like
[id].js?easy
Solution
Step 1: Understand file naming in Next.js API routes
Square brackets in filenames like[id].jsindicate 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 AQuick 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
Solution
Step 1: Recall how Next.js passes dynamic route params
Next.js provides dynamic route parameters insidereq.queryin API routes.Step 2: Identify the correct syntax
Accessingidis done byreq.query.id, notreq.paramsor others.Final Answer:
const id = req.query.id; -> Option CQuick 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
What will be the JSON response when a client requests
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
Solution
Step 1: Extract dynamic parameter from URL
The URL/api/user/42matches the dynamic route[userId].js, souserIdis "42".Step 2: Check the handler response
The handler readsuserIdfromreq.queryand returns JSON with message including that value.Final Answer:
{"message":"User ID is 42"} -> Option DQuick 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
What is the bug in this code?
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
Solution
Step 1: Analyze the conditional response
Ifpidis 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 BQuick 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
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
BothorderIdanditemIdappear inreq.queryas 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 AQuick 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
