Portafolio

12 minPor Cristian Developer

Como conectar nestJS a una base de datos.

Guia de como agregar una base de datos a nestjs con TypeOrm.

#nestjs#typeorm#backend

Configuración de PostgreSQL con NestJS y Docker

Esta guía te ayudará a configurar un entorno de base de datos utilizando Docker (para evitar instalaciones locales pesadas) y cómo integrarlo con NestJS mediante TypeORM.


📋 Requisitos Previos


Paso 1: Configuración de Docker Compose

En lugar de instalar PostgreSQL directamente en tu sistema operativo, usaremos un contenedor. Crea un archivo llamado docker-compose.yaml en la raíz de tu proyecto, este sirve para configurar la base de datos.

Nota: Si tienes instalado postgres en tu computador salta al paso 3

version: '3'
services:
  db:
    image: postgres:14.3
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ${DB_NAME}
    container_name: nest_postgres_db
    volumes:
      - ./postgres-data:/var/lib/postgresql/data

Paso 2: Levantar la Base de Datos

Con el archivo docker-compose.yaml listo, levanta el servicio desde una consola ya sea cmd o bash con el siguiente comando:

docker compose up -d

Nota: Docker detectará que no tienes la imagen de postgres y la descargará automáticamente, despues levantará el servicio en segundo plano (-d).

Paso 3: Variables de Entorno y Dependencias

1. Crear archivo .env
Para proteger tus credenciales, crea un archivo .env en la raíz del proyecto

DB_PASSWORD=mi_contrasena_segura
DB_NAME=nombre_db_ejemplo
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=postgres

2. Instalar dependencias necesarias
Ejecuta el siguiente comando en tu terminal para instalar el soporte de variables de entorno y el ORM

# Soporte para variables de entorno
npm i --save @nestjs/config

# TypeORM y Driver de PostgreSQL
npm install --save @nestjs/typeorm typeorm pg

Paso 4: Integración en AppModule

Una vez instalados los paquetes, navega y modifica el archivo src/app.module.ts..Es fundamental que ConfigModule se cargue antes que TypeOrmModule para que las variables de entorno estén disponibles antes que TypeOrm las lea.

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    // Carga de variables de entorno
    ConfigModule.forRoot(),

    // Configuración de la conexión
    TypeOrmModule.forRoot({
      type: 'postgres', 
      host: process.env.DB_HOST,
      port: parseInt(process.env.DB_PORT),
      username: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_NAME,
      autoLoadEntities: true, // Registra automáticamente las clases con @Entity()
      synchronize: true,      // Sincroniza el esquema con la DB (Solo Desarrollo)
    }),

    // Otros módulos
    ProductsModule,
    UsersModule,
    CategoriasModule,
    PedidosModule,
  ],
})
export class AppModule {}

Synchronize: En producción, cambia synchronize: true a false para evitar la pérdida accidental de datos.

Paso 5: Registrar la Entidad en el Módulo

Para comprobar que todo funciona, crearemos una entidad sencilla. Las entidades en NestJS son clases que representan las tablas de tu base de datos.

1. Crear un recurso

Primero debemos crear un rocurso esto es para crear los archivos necesarios para hacer un crud con enpoints y hacer peticiones.

nest g resource products

2. Definir la Entidad

Crea el archivo src/products/entities/product.entity.ts y pega el siguiente codigo:

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity() // Esto indica que la clase es una tabla de BD
export class Product {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ type: 'text' })
  name: string;

  @Column({ type: 'float', default: 0 })
  price: number;
}

3. Registrar la entidad en el modulo de products

Navegar a ProductsModule (o el módulo que estés usando) e importe el TypeOrmModule.forFeature para registrar la entidad correspondiente

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Product } from './entities/product.entity';

@Module({
  imports: [TypeOrmModule.forFeature([Product])], // Registra la entidad aquí
  // ... controllers y providers
})
export class ProductsModule {}

¿Cómo saber si funcionó?

  1. Guarda todos los cambios.
  2. Si tu servidor de NestJS no está corriendo, ejecuta:
    npm run start:dev
  3. Observa la consola y verifica que no existan errores.
  4. Abre una herramienta de gestión de bases de datos como:
    • TablePlus
    • DBeaver
    • pgAdmin
    • dataGrip
  5. Conéctate usando las credenciales definidas en tu archivo .env.

Si todo está correcto, deberías ver la tabla product creada automáticamente, con las columnas:

  • id
  • name
  • price

Con esto finalizamos la configuración de la base de datos. El siguiente paso consiste en definir el modelo de datos mediante entidades y desarrollar la lógica para los endpoints y el CRUD.


Por ultimo con typeOrm puedes conectar varios tipos de bases de datos ya sea SQL o No-sql como por ejemplo:

  • MySQL
  • PostgreSQL
  • MariaDB
  • SQLite
  • MS SQL Server
  • Oracle
  • MongoDB

Otros posts que te pueden interesar

CRUD con Express usando TypeScript y Prisma

Aprende a construir un CRUD completo utilizando Express, TypeScript y Prisma ORM, conectando una base de datos PostgreSQL y aplicando buenas prácticas en la estructura del proyecto.

React Server Components explicados

Una guía completa sobre React Server Components y cómo cambiarán la forma en que desarrollamos.