plugins/aai-stack-express/skills/express-validation/SKILL.md
February 1, 2026
Select agents to install to:
npx add-skill https://github.com/the-answerai/alphaagent-team/blob/main/plugins/aai-stack-express/skills/express-validation/SKILL.md -a claude-code --skill express-validationInstallation paths:
.claude/skills/express-validation/# Express Validation Skill
Patterns for validating request input in Express.js applications.
## Zod Validation
### Basic Schema
```typescript
import { z } from 'zod'
// User schema
const createUserSchema = z.object({
name: z.string().min(1, 'Name is required').max(100),
email: z.string().email('Invalid email format'),
password: z.string().min(8, 'Password must be at least 8 characters'),
age: z.number().int().positive().optional(),
})
const updateUserSchema = createUserSchema.partial()
// Product schema
const productSchema = z.object({
name: z.string().min(1).max(200),
description: z.string().optional(),
price: z.number().positive(),
category: z.enum(['electronics', 'clothing', 'books', 'other']),
tags: z.array(z.string()).default([]),
})
```
### Validation Middleware Factory
```typescript
import { z, ZodSchema } from 'zod'
import { Request, Response, NextFunction } from 'express'
type RequestLocation = 'body' | 'query' | 'params'
function validate(schema: ZodSchema, location: RequestLocation = 'body') {
return (req: Request, res: Response, next: NextFunction) => {
const result = schema.safeParse(req[location])
if (!result.success) {
return res.status(400).json({
error: 'Validation failed',
details: result.error.flatten().fieldErrors,
})
}
req[location] = result.data
next()
}
}
// Usage
router.post('/users', validate(createUserSchema), createUser)
router.get('/users', validate(paginationSchema, 'query'), listUsers)
router.get('/users/:id', validate(idParamSchema, 'params'), getUser)
```
### Combined Validation
```typescript
interface ValidationSchemas {
body?: ZodSchema
query?: ZodSchema
params?: ZodSchema
}
function validateAll(schemas: ValidationSchemas) {
return (req: Request, res: Response, next: NextFunction) => {
const errors: Record<string, unknown> = {}
for (const [location, schema] of Object.entries(schemas)) {
if (schema) {
const result = s