Configuración de PostgreSQL con TypeORM en aplicaciones NestJS

Clase 12 de 35Curso de Backend con NestJS

Resumen

Configurar un ORM (Object Relational Mapper) es esencial para conectar aplicaciones modernas con bases de datos utilizando principios de orientación a objetos. Esta guía muestra cómo integrar TypeORM con PostgreSQL en NestJS, destacando buenas prácticas de seguridad y flexibilidad.

¿Qué es un ORM y para qué sirve en NestJS?

Un ORM permite interactuar con la base de datos a través de entidades y objetos, simplificando el acceso y manipulación de datos. Frameworks populares como Laravel en PHP o Django en Python emplean sus propios ORMs; en el caso de NestJS, existen diversas opciones como TypeORM, MicroORM y Prisma.

  • Permite mapear bases de datos transaccionales a objetos accesibles en la aplicación.
  • Soporta múltiples motores: MySQL, MariaDB, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, incluso MongoDB.
  • Facilita la declaración e integración de entidades directamente desde el código.

¿Cómo instalar TypeORM y conectarlo a PostgreSQL?

La instalación y configuración de TypeORM es directa. Aquí tienes los pasos principales:

  1. Instala las dependencias necesarias usando la terminal:
  2. npm install @nestjs/typeorm typeorm pg
  3. Aquí, pg actúa como el driver nativo de Node.js para PostgreSQL.
  4. Realiza la integración en el app.module:
  5. Importa TypeOrmModule y usa la función forRoot para definir los parámetros de conexión.
  6. Configura tipo, host, puerto (normalmente 5432), usuario, contraseña y base de datos.
  7. Utiliza opciones como autoLoadEntities: true y synchronize: true para facilitar el trabajo inicial con entidades.

¿Qué riesgos hay al colocar credenciales directamente en el código?

Exponer usuarios y contraseñas en el código fuente es un riesgo importante tanto de seguridad como de flexibilidad:

  • Al subir el código a la nube, otros desarrolladores pueden tener acceso a las credenciales.
  • Si se hace un despliegue en producción, sería necesario modificar directamente el archivo fuente, lo cual es poco eficiente y riesgoso.

¿Cómo usar variables de entorno para la configuración segura?

Emplear variables de entorno resuelve los problemas de seguridad y adaptación a distintos entornos (desarrollo, pruebas, producción):

  1. Crea un archivo .env ignorado en el repositorio.
  2. Define las variables necesarias, por ejemplo:

POST_HOST=localhost POST_PORT=5432 POST_DB=myblogdb BLOG_USER=usuario BLOG_PASSWORD=contraseñaSeguro

  1. Mapea estas variables en la configuración del módulo, utilizando ConfigService para inyectarlas.
  2. Cambia la inicialización de TypeOrmModule de forRoot a forRootAsync, empleando la opción useFactory para obtener dinámicamente los valores del entorno.

typescript TypeOrmModule.forRootAsync({ imports: [ConfigModule], inject: [ConfigService], useFactory: (configService: ConfigService) => ({ type: 'postgres', host: configService.get('POST_HOST'), port: +configService.get('POST_PORT'), username: configService.get('BLOG_USER'), password: configService.get('BLOG_PASSWORD'), database: configService.get('POST_DB'), autoLoadEntities: true, synchronize: true, }) })

¿Cómo verificar la conexión y evitar errores frecuentes?

Al iniciar la aplicación, verifica los mensajes en la terminal. Si el ORM muestra errores relacionados con drivers o credenciales:

  • Comprueba el tipo de base de datos especificado.
  • Asegura que el usuario y la contraseña coincidan con los valores de la base de datos.
  • Si la conexión es exitosa, la terminal mostrará la inicialización correcta del TypeOrmModule.

Aprovecha la flexibilidad de las variables de entorno para manejar distintos escenarios sin exponer datos sensibles. Si tienes dudas o quieres compartir tu experiencia, ¡anímate a dejar un comentario con tus aprendizajes!