Express API Skill
Description
Generate Express.js REST APIs with TypeScript and best practices.
Trigger
-
/express command
-
User requests Express API
-
User needs Node.js backend
Prompt
You are an Express.js expert that creates production-ready APIs.
Express App Setup
// src/app.ts import express, { Express, Request, Response, NextFunction } from 'express'; import cors from 'cors'; import helmet from 'helmet'; import morgan from 'morgan'; import { router } from './routes'; import { errorHandler } from './middleware/errorHandler';
const app: Express = express();
// Middleware app.use(helmet()); app.use(cors({ origin: process.env.CORS_ORIGIN, credentials: true })); app.use(morgan('combined')); app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true }));
// Routes app.use('/api/v1', router);
// Health check app.get('/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString() }); });
// Error handling app.use(errorHandler);
export { app };
Router with Controllers
// src/routes/users.ts import { Router } from 'express'; import { UserController } from '../controllers/UserController'; import { validate } from '../middleware/validate'; import { authenticate } from '../middleware/auth'; import { CreateUserSchema, UpdateUserSchema } from '../schemas/user';
const router = Router(); const controller = new UserController();
router.get('/', authenticate, controller.getAll); router.get('/:id', authenticate, controller.getById); router.post('/', validate(CreateUserSchema), controller.create); router.put('/:id', authenticate, validate(UpdateUserSchema), controller.update); router.delete('/:id', authenticate, controller.delete);
export { router as userRouter };
Controller
// src/controllers/UserController.ts import { Request, Response, NextFunction } from 'express'; import { UserService } from '../services/UserService'; import { AppError } from '../utils/AppError';
export class UserController { private userService = new UserService();
getAll = async (req: Request, res: Response, next: NextFunction) => { try { const { page = 1, limit = 10 } = req.query; const users = await this.userService.findAll({ page: Number(page), limit: Number(limit), }); res.json(users); } catch (error) { next(error); } };
getById = async (req: Request, res: Response, next: NextFunction) => { try { const user = await this.userService.findById(req.params.id); if (!user) { throw new AppError('User not found', 404); } res.json(user); } catch (error) { next(error); } };
create = async (req: Request, res: Response, next: NextFunction) => { try { const user = await this.userService.create(req.body); res.status(201).json(user); } catch (error) { next(error); } }; }
Error Handler Middleware
// src/middleware/errorHandler.ts import { Request, Response, NextFunction } from 'express'; import { AppError } from '../utils/AppError';
export function errorHandler( err: Error, req: Request, res: Response, next: NextFunction ) { console.error(err);
if (err instanceof AppError) { return res.status(err.statusCode).json({ error: { code: err.code, message: err.message, }, }); }
res.status(500).json({ error: { code: 'INTERNAL_ERROR', message: 'An unexpected error occurred', }, }); }
Validation Middleware
// src/middleware/validate.ts import { Request, Response, NextFunction } from 'express'; import { ZodSchema } from 'zod';
export function validate(schema: ZodSchema) { return (req: Request, res: Response, next: NextFunction) => { const result = schema.safeParse(req.body); if (!result.success) { return res.status(400).json({ error: { code: 'VALIDATION_ERROR', details: result.error.errors, }, }); } req.body = result.data; next(); }; }
Tags
express , nodejs , api , rest , backend
Compatibility
-
Codex: ✅
-
Claude Code: ✅