Ensure data integrity with CanxJS's powerful validation system. Use simple inline validation or dedicate FormRequest classes for complex logic.
The validate helper provides a quick way to validate arbitrary data against a set of rules.
1import { validate } from "canxjs";23app.post("/users", async (req, res) => {4const data = await req.body();56const rules = {7name: ["required", "string", "min:3"],8email: ["required", "email"],9age: ["number", "min:18"],10role: ["in:admin,user,editor"]11};1213const validation = validate(data, rules);1415if (!validation.valid) {16return res.status(422).json({17error: "Validation Failed",18details: Object.fromEntries(validation.errors)19});20}2122// Use validated data23const user = await User.create(validation.data);24return res.json(user);25});
For more complex scenarios, Form Requests encapsulate validation and authorization logic in a single class, keeping your controllers clean.
1// src/requests/CreateUserRequest.ts2import { FormRequest } from "canxjs";34export class CreateUserRequest extends FormRequest {5/**6* Determine if the user is authorized to make this request.7*/8authorize(): boolean {9// Check permissions, roles, etc.10return true;11}1213/**14* Get the validation rules that apply to the request.15*/16rules() {17return {18name: ["required", "string", "min:3"],19email: ["required", "email", "unique:users,email"],20password: ["required", "string", "min:8", "confirmed"],21};22}2324/**25* Custom error messages (optional)26*/27messages() {28return {29"email.unique": "This email is already registered.",30"password.confirmed": "Passwords do not match."31};32}33}
Use the @ValidateWith decorator to automatically validate requests before they hit your controller method.
1// src/controllers/UserController.ts2import { Controller } from "canxjs/controller";3import { ValidateWith } from "canxjs";4import { CreateUserRequest } from "../requests/CreateUserRequest";56export class UserController extends Controller {78@ValidateWith(CreateUserRequest)9async store(req: CanxRequest, res: CanxResponse) {10// Code execution only reaches here if validation passes.1112// Get validated data safely13const data = req.context.get("validated");1415const user = await User.create(data);16return res.status(201).json(user);17}18}
requiredField must be present and not emptystringMust be a stringnumberMust be a numberbooleanMust be true or falseemailMust be a valid email formatmin:valueMinimum length (string) or value (number)max:valueMaximum length (string) or value (number)in:foo,barMust be one of the given valuesurlMust be a valid URLalphaOnly alphabetic charactersalphanumOnly alphanumeric charactersconfirmedField must match {field}_confirmation