Construye una API REST profesional con NestJS, Prisma, PostgreSQL y Docker

Construye una API REST profesional con NestJS, Prisma, PostgreSQL y Docker

Tutorial NestJS Prisma: Crea una API REST de producción con TypeScript, PostgreSQL, JWT, Swagger y Docker

¿Buscas un tutorial NestJS Prisma completo para crear una API REST NestJS lista para producción? En esta guía didáctica y paso a paso construimos una API con NestJS + TypeScript, Prisma PostgreSQL como ORM/BD, seguridad con NestJS JWT (access y refresh), documentación OpenAPI NestJS (Swagger), pruebas con Jest/Supertest, observabilidad, caché con Redis y despliegue con Docker NestJS. Ideal para desarrolladores backend principiantes e intermedios.


1) Requisitos e instalación

  • Node.js 20+
  • npm o pnpm, npx
  • Git
  • Docker y Docker Compose
  • Postman/Insomnia (opcional)

Verificaciones rápidas:

Checklist

  • Node.js y gestor de paquetes instalados
  • Docker y Compose funcionando
  • Repositorio Git inicializado

2) Inicialización del proyecto con Nest CLI, ESLint/Prettier y Git Hooks

Crea un proyecto NestJS:

Estructura básica de carpetas (resumen):

Configura ESLint y Prettier (ya vienen con Nest). Añade Husky + lint-staged + Commitlint para calidad de commits:

package.json (fragmento):

Checklist

  • Proyecto Nest creado
  • Hooks de Git (Husky, lint-staged) y Commitlint activos

3) Configuración por entornos con @nestjs/config y validación

Instala dependencias:

Crea un esquema de validación con Joi y usa archivos .env por ambiente (dev/test/prod) siguiendo 12-Factor.

Archivo: .env.example

Copia .env.example a .env y ajusta valores por entorno.

Checklist

  • .env.example creado
  • Validación de variables planificada

4) Base de datos con Prisma + PostgreSQL: modelos, migraciones y seed

Instala Prisma y el cliente:

prisma/schema.prisma

Migraciones y seed:

prisma/seed.ts

package.json (scripts de Prisma):

Transacciones y pool: Prisma usa pooling del driver. Ajusta connectionlimit y timeouts en DATABASEURL. Para transacciones:

Checklist

  • Modelos User, Post, Comment definidos
  • Migraciones aplicadas y seed ejecutado
  • URL de BD con parámetros de pool/timeout

5) Arquitectura NestJS: módulos, DTOs, pipes, filtros e interceptores

src/app.module.ts

src/common/filters/http-exception.filter.ts

src/common/interceptors/logging.interceptor.ts

src/common/guards/roles.guard.ts y decorador @Roles

Pipes personalizados (ejemplo: paginación)

Checklist

  • Módulos definidos
  • Validation/Filters/Interceptors/Guards listos
  • Pipe de paginación disponible

6) Seguridad y autenticación: NestJS JWT (access y refresh), Passport, CORS, Helmet y rate limiting

Instala dependencias de auth:

src/auth/auth.module.ts

src/auth/auth.service.ts

src/auth/jwt.strategy.ts

src/auth/refresh.strategy.ts

Checklist

  • Registro y login con hash de contraseñas (argon2)
  • JWT access/refresh con rotación
  • Strategies configuradas

7) Endpoints y negocio: CRUD de usuarios y posts, paginación y versionado

DTOs con class-validator y class-transformer:

src/users/dto/create-user.dto.ts

src/users/users.service.ts

src/users/users.controller.ts

src/users/users.module.ts

Posts (resumen):

src/posts/dto/create-post.dto.ts

src/posts/posts.service.ts

src/posts/posts.controller.ts

Ejemplos con curl:

Checklist

  • CRUD básico de usuarios y posts
  • Paginación/filtrado implementado
  • Versionado v1 en rutas

8) Documentación OpenAPI/Swagger en NestJS

src/main.ts (Bootstrap con Swagger, CORS, Helmet, Throttler y ValidationPipe)

Checklist

  • Swagger habilitado con BearerAuth
  • DTOs anotados con ApiProperty
  • Documentación accesible en /api/docs

9) Logging, salud y monitorización (Terminus, request ID y métricas)

Health endpoints con @nestjs/terminus:

Opcional: métricas Prometheus exponiendo /metrics con prom-client.

Checklist

  • Endpoint de liveness listo
  • Logs con request ID
  • Métricas opcionales planificadas

10) Caché con Redis (opcional) usando @nestjs/cache-manager

Ejemplo de uso en PostsService:

Estrategias de invalidación: invalidar por claves asociadas a entidades al crear/actualizar/eliminar.

Checklist

  • Redis opcional conectado
  • Política de TTL e invalidación definida

11) Pruebas con Jest y Supertest: unitarias y E2E

Instala Supertest:

jest.config.ts

test/app.e2e-spec.ts

BD de pruebas: usa una DATABASE_URL de test y ejecuta npx prisma migrate reset –force antes de los E2E (via script de npm o setupFile).

Checklist

  • Config Jest listo
  • Pruebas E2E básicas operativas
  • Reset de BD de test definido

12) Dockerización y orquestación local con Docker Compose

Dockerfile (multi-stage)

docker-compose.yml

Comandos útiles:

Checklist

  • Dockerfile multi-stage creado
  • Compose con API, Postgres y Redis
  • Variables de entorno seguras (usa secrets en prod)

13) CI/CD básico con GitHub Actions

.github/workflows/ci.yml

Checklist

  • Workflow con install, lint, test, build
  • Build/push de imagen a registro
  • Secrets gestionados en GitHub

14) Rendimiento y buenas prácticas de producción

  • HTTP keep-alive activo por defecto en Node 20
  • Compresión con compression (cuidado con payloads ya comprimidos)
  • Limita payloads y valida con class-validator
  • Índices en BD: añade @@index en campos consultados
  • Paginación eficiente: usa cursor-based para listas grandes
  • Pooling/Timeouts en DATABASEURL (statementtimeout, connect_timeout)
  • Consultas preparadas y parametrizadas (Prisma ya parametriza)
  • Rate limiting con @nestjs/throttler
  • Escalado: PM2 o cluster mode (Kubernetes), replica horizontal detrás de un balanceador
  • Reintentos/backoff en clientes externos

Checklist

  • Validaciones y límites definidos
  • Timeouts/pooling ajustados
  • Estrategia de escalado contemplada

15) Cierre, troubleshoot y próximos pasos

Problemas comunes y solución

  • Prisma Client no generado: ejecuta npx prisma generate
  • Migraciones fallan: revisa DATABASE_URL, corre npx prisma migrate reset –force en dev
  • CORS bloquea peticiones: ajusta app.enableCors({ origin: […] })
  • JWT expirado: renueva con /auth/refresh usando el refresh token
  • Error EADDRINUSE: cambia PORT o libera el puerto
  • Docker Postgres no levanta: verifica healthcheck y logs docker compose logs db

Checklist global final

  • API REST NestJS con endpoints versionados
  • Seguridad con JWT access/refresh, Helmet, CORS, rate limit
  • Prisma PostgreSQL con migraciones/seed y transacciones
  • Documentación Swagger OpenAPI
  • Pruebas unitarias/E2E con Jest/Supertest
  • Observabilidad: logs, health y métricas opcionales
  • Dockerización y pipeline CI listos

Próximos pasos

  • Autorización granular por recurso y ownership
  • Colas con BullMQ para trabajos asíncronos
  • Subida de archivos a S3/GCS
  • Auditoría y trazas con OpenTelemetry (OTLP, Jaeger/Tempo)

Archivos clave restantes y utilidades

Rutas de Auth (controlador rápido)

nest-cli.json

package.json (scripts útiles)


Resolución de problemas comunes.

  • ¿Qué es Prisma y por qué usarlo con NestJS?
  • Prisma es un ORM moderno con tipado fuerte y migraciones. Con NestJS acelera el desarrollo y reduce errores en acceso a datos.
  • ¿Cómo proteger una API REST NestJS con JWT?
  • Implementa estrategias de Passport para access y refresh tokens, guarda hash del refresh y rota tokens en cada renovación.
  • ¿Cómo documentar una API NestJS con OpenAPI?
  • Usa @nestjs/swagger, anota DTOs con ApiProperty y habilita SwaggerModule en main.ts para exponer /api/docs.
  • ¿Cómo ejecutar la API en Docker?
  • Define un Dockerfile multi-stage, orquesta con docker-compose (API + Postgres + Redis) y configura variables de entorno seguras.
  • ¿Cómo probar con Jest y Supertest?
  • Crea pruebas unitarias/E2E, configura jest.config.ts y usa Supertest contra el servidor Nest; resetea la BD de pruebas con Prisma.

Conclusión

Has construido una API REST NestJS de calidad producción con Prisma PostgreSQL, seguridad con NestJS JWT, documentación OpenAPI NestJS, pruebas y despliegue con Docker NestJS. Sigue los checklists, añade monitoreo profundo y CI/CD para llevarla a producción con confianza. ¿Listo para el siguiente nivel? Integra permisos por recurso, colas y trazas con OpenTelemetry para una plataforma robusta a escala.