Validation
- Validation ensures API requests contain correct and safe data using tools like Joi and Express-validator.
Request Validation
Request validation checks that the data sent by the client (in body, query, or params) meets required rules like type, length, or format
Why Validation is Important:
Prevents invalid or malicious data
Protects database from incorrect entries
Improves user experience with meaningful errors
Reduces backend crashes
Example – Manual Validation
Request Validation in Express.js
Checks client data for required fields and correct formats. Returns errors for invalid input to protect the database and improve reliability.
app.post("/register", (req, res) => {
const { name, email, age } = req.body;
if (!name || !email) {
return res.status(400).send("Name and email are required");
}
if (age && age < 18) {
return res.status(400).send("Age must be at least 18");
}
res.send("Validation passed, user can be saved");
});
Explanation:
Simple if-checks to validate required fields
Not scalable for complex rules — better use validation libraries
Using Joi / Express-Validator
Libraries like Joi and Express-validator make validation structured and reusable.
npm install joi
Request Validation Using Joi
Uses Joi to define reusable validation schemas and automatically check client data, returning structured error messages for invalid input.
const Joi = require("joi");
const userSchema = Joi.object({
name: Joi.string().min(3).required(),
email: Joi.string().email().required(),
age: Joi.number().integer().min(18)
});
app.post("/register", (req, res) => {
const { error } = userSchema.validate(req.body);
if (error) {
return res.status(400).json({ error: error.details[0].message });
}
res.send("User data is valid");
});
Explanation:
Schema defines rules clearly
.validate() checks the incoming data
Error messages are descriptive
Express-Validator Example
npm install express-validator
Request Validation Using Express-Validator
Uses express-validator to validate incoming request data with middleware, returning structured errors if fields are missing or invalid.
const { body, validationResult } = require("express-validator");
app.post("/register",
body("name").isLength({ min: 3 }),
body("email").isEmail(),
body("age").optional().isInt({ min: 18 }),
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
res.send("User data is valid");
}
);
Explanation:
Middleware validates request fields before route logic
validationResult captures errors in a structured array
Works well for multiple endpoints