Use this file to discover all available pages before exploring further.
Este módulo construye una API REST de estilo producción para la aplicación DevJobs usando Express v5. La arquitectura sigue el patrón MVC (Models-Controllers-Routes), con validación de esquemas mediante Zod, middleware CORS configurable y módulos ESM a lo largo de todo el proyecto.
04-express/├── app.js # Entry point: crea la app Express y registra middlewares├── config.js # Constantes globales (PORT, límites de paginación)├── jobs.json # Dataset de empleos en memoria├── routes/│ └── jobs.js # Definición de rutas y middlewares de validación inline├── controllers/│ └── jobs.js # Lógica de cada endpoint (llama al modelo)├── models/│ └── job.js # Acceso a datos: filtrado, paginación y CRUD en memoria├── schemas/│ └── jobs.js # Esquemas Zod para validar el body de las requests├── middlewares/│ └── cors.js # Middleware CORS con lista de orígenes permitidos└── package.json # Dependencias: express ^5.2.1, cors ^2.8.5, zod ^4.3.5
El archivo schemas/jobs.js define el esquema completo de un empleo y exporta dos funciones de validación:
import * as z from 'zod'const jobSchema = z.object({ titulo: z .string({ error: 'El título es obligatorio' }) .min(3, 'El título debe tener al menos 3 caracteres') .max(100, 'El título no puede exceder los 100 caracteres'), empresa: z.string(), ubicacion: z.string(), descripcion: z.string().optional(), data: z.object({ technology: z.array(z.string()), modalidad: z.string(), nivel: z.string(), }),})export function validateJob(input) { return jobSchema.safeParse(input)}export function validatePartialJob(input) { return jobSchema.partial().safeParse(input)}
validateJob valida el esquema completo (creación). validatePartialJob llama a .partial() sobre el mismo esquema, haciendo todos los campos opcionales (ideal para PATCH).
La condición || !origin permite solicitudes sin cabecera Origin (como las que vienen de herramientas CLI como curl o Postman). Para personalizar los orígenes permitidos puedes pasar un array al instanciar el middleware:
Este módulo usa Express v5, no v4. En v5, los errores lanzados en handlers async se propagan automáticamente al middleware de error sin necesidad de try/catch o next(err). Asegúrate de no mezclar patrones de v4 al extender la aplicación.