Laravel-inspired request validation for Express.
Simple, clean, and developer-friendly validation with automatic 422 responses and validated data extraction.
npm install @caplab/form-requestimport express from "express";
import { validation } from "@caplab/form-request";
const app = express();
app.use(express.json());
app.use(validation());
app.post("/register", async (req, res) => {
await req.validate({
email: "required|email",
password: "required|min:6",
});
const data = req.validated();
res.json({
success: true,
data,
});
});Validation in Express is often verbose or fragmented across middleware.
Form Request brings a Laravel-style validation experience to Express:
- Laravel-like validation syntax
- Automatic
422JSON responses - Clean validated data extraction
- Removes unvalidated fields automatically
- Inline validation or class-based requests
- Works with both JavaScript and TypeScript
- Pipe-style validation rules
'email': 'required|email|min:5'- Automatic validation error responses
req.validated()returns only validated fields- Nested object validation
- Array wildcard validation
- Custom validation rules
- Custom error messages
- TypeScript support
- FormRequest classes
app.post("/login", async (req, res) => {
const data = await req.validate({
email: "required|email",
password: "required|min:6",
});
res.json(data);
});import { FormRequest } from "@caplab/form-request";
class RegisterRequest extends FormRequest {
rules() {
return {
email: "required|email",
password: "required|min:6",
};
}
messages() {
return {
"email.required": "Email is required",
"email.email": "Email must be valid",
};
}
}
app.post("/register", async (req, res) => {
await req.validate(RegisterRequest);
const data = req.validated();
res.json(data);
});Extra fields are automatically removed.
Request body:
{
"email": "john@example.com",
"password": "123456",
"is_admin": true
}Validated result:
const data = req.validated();Output:
{
"email": "john@example.com",
"password": "123456"
}await req.validate({
"user.email": "required|email",
"user.name": "required",
"users.*.email": "required|email",
});import { extend } from "@caplab/form-request";
extend("phone", async (value) => {
return /^\d{10}$/.test(value);
});
await req.validate({
phone: "required|phone",
});await req.validate(
{
email: "required|email",
},
{
attributes: {
email: "email address",
},
},
);Response:
{
"message": "The email address field is required."
}| Rule | Description |
|---|---|
required |
Field is required |
nullable |
Field may be null |
string |
Must be a string |
number |
Must be a number |
integer |
Must be an integer |
boolean |
Must be a boolean |
array |
Must be an array |
object |
Must be an object |
email |
Must be a valid email |
min:n |
Minimum value or length |
max:n |
Maximum value or length |
same:field |
Must match another field |
confirmed |
Requires {field}_confirmation |
{
"message": "The given data was invalid.",
"errors": {
"email": ["The email field is required."]
}
}MIT