Create Reusable Validation Middleware

Create src/middleware/validate.middleware.js.

Instead of manually validating each request in every controller, create a reusable middleware.

The middleware receives a Zod schema and validates the request body.

If validation succeeds, replace req.body with the parsed and validated value.

If validation fails, return a structured 400 response or pass a validation error to centralized error middleware.

src/middleware/validate.middleware.js
export function validateBody(schema) {
  return (req, res, next) => {
    const result = schema.safeParse(req.body);

    if (!result.success) {
      return res.status(400).json({
        success: false,
        message: 'Validation failed',
        errors: result.error.issues.map((issue) => ({
          field: issue.path.join('.'),
          message: issue.message
        }))
      });
    }

    req.body = result.data;
    next();
  };
}

Creates middleware that validates request bodies, returns readable validation errors, and replaces the request body with parsed data.

Key Takeaways
  • Validation middleware avoids duplicated validation logic.

  • safeParse() returns structured validation results.

  • Only validated data should reach controllers.