We check route parameters and query data to make sure they are correct before using them. This helps avoid errors and keeps the app safe.
Validating route params and query in Express
Start learning this pattern below
Jump into concepts and practice - no test required
app.get('/path/:param', (req, res) => { const param = req.params.param; const queryValue = req.query.key; // Validate param and queryValue here if (/* validation fails */) { return res.status(400).send('Invalid input'); } res.send('Valid input'); });
Route params come from req.params and query strings come from req.query.
Validation is usually done inside the route handler before using the data.
id param is only digits.app.get('/user/:id', (req, res) => { const id = req.params.id; if (!/^[0-9]+$/.test(id)) { return res.status(400).send('User ID must be a number'); } res.send(`User ID is ${id}`); });
term is not empty or missing.app.get('/search', (req, res) => { const term = req.query.term; if (!term || term.trim() === '') { return res.status(400).send('Search term is required'); } res.send(`Searching for ${term}`); });
app.get('/event/:date', (req, res) => { const date = req.params.date; if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) { return res.status(400).send('Date must be YYYY-MM-DD'); } res.send(`Event date is ${date}`); });
This Express app has a route that checks if the product ID is a number and if the optional color query is one of the allowed colors. It sends an error if validation fails.
import express from 'express'; const app = express(); const port = 3000; app.get('/product/:productId', (req, res) => { const productId = req.params.productId; const color = req.query.color; // Validate productId is a number if (!/^[0-9]+$/.test(productId)) { return res.status(400).send('Product ID must be a number'); } // Validate color is one of allowed values const allowedColors = ['red', 'blue', 'green']; if (color && !allowedColors.includes(color.toLowerCase())) { return res.status(400).send('Color must be red, blue, or green'); } res.send(`Product ID: ${productId}, Color: ${color || 'default'}`); }); app.listen(port, () => { console.log(`Server running on http://localhost:${port}`); });
Always validate both route params and query strings to avoid unexpected errors.
Use regular expressions or simple checks to validate formats and allowed values.
Send clear error messages with status 400 when input is invalid.
Validate route params from req.params and query strings from req.query.
Use simple checks or regex to confirm data is correct before using it.
Return a 400 error with a helpful message if validation fails.
Practice
Solution
Step 1: Understand the role of validation
Validation checks if the data coming from the user is correct and safe to use.Step 2: Identify the benefits of validation
It prevents errors in the app and protects against malicious input that could cause security problems.Final Answer:
To ensure the data is correct and prevent errors or security issues -> Option CQuick Check:
Validation = prevent errors and security risks [OK]
- Thinking validation speeds up the server
- Confusing validation with UI rendering
- Believing validation changes URLs automatically
id in Express?Solution
Step 1: Recall Express request object properties
Route parameters are accessed viareq.params.Step 2: Match the parameter name
To get theidparameter, usereq.params.id.Final Answer:
req.params.id -> Option DQuick Check:
Route params = req.params [OK]
- Using req.query for route params
- Trying to get params from req.body without POST data
- Using req.route which is not for params
app.get('/user/:id', (req, res) => {
const id = req.params.id;
if (!/^\d+$/.test(id)) {
return res.status(400).send('Invalid ID');
}
res.send(`User ID is ${id}`);
});What will be the response if the URL is
/user/abc123?Solution
Step 1: Understand the regex validation
The regex^\d+$matches only digits from start to end.Step 2: Check the input against regex
The inputabc123contains letters, so it fails the test.Step 3: Identify the response on failure
The code returns status 400 with message 'Invalid ID' when validation fails.Final Answer:
Invalid ID -> Option BQuick Check:
Non-digit ID triggers 400 error [OK]
- Assuming letters pass the digit-only regex
- Expecting 404 instead of 400 error
- Thinking it returns the ID even if invalid
app.get('/search', (req, res) => {
const { term } = req.query;
if (!term || term.length < 3) {
res.status(400).send('Search term too short');
}
res.send(`Searching for ${term}`);
});What is the bug in this code?
Solution
Step 1: Analyze the validation logic
Iftermis missing or too short, it sends a 400 response.Step 2: Check flow after sending response
There is noreturnafterres.status(400).send(), so code continues and tries to send another response.Step 3: Identify the error caused
Sending two responses causes an error about headers already sent.Final Answer:
It does not return after sending 400 response, causing headers error -> Option AQuick Check:
Always return after sending error response [OK]
- Missing return after res.send causes crash
- Confusing req.params with req.query
- Thinking GET cannot have query params
userId (must be a number) and a query parameter active (must be 'true' or 'false') in Express. Which code snippet correctly validates both and returns 400 errors if invalid?Solution
Step 1: Validate userId as digits string
uses regex^\d+$onreq.params.userId, correctly checking it is numeric string.Step 2: Validate active query param as 'true' or 'false'
checksactiveequals 'true' or 'false' strings, returning 400 if not.Step 3: Confirm proper returns after errors
usesreturnafter sending 400 responses, preventing multiple sends.Final Answer:
Correctly validates both parameters and returns errors properly -> Option AQuick Check:
Regex + strict string checks + return after error = correct [OK]
- Not returning after res.status(400).send
- Checking query params in req.params
- Using loose type checks instead of strict string comparison
