Prefacio
Viniendo de Laravel, que tiene una miríada de características integradas, comencé a resentir el cambio a NodeJS. Configurar el manejo de errores, el registro, la inyección de dependencias, etc., no era lo que tenía en mente. Afortunadamente, encontré NestJS, con su arquitectura lista para usar y su excelente documentación, empecé a sentirme como en casa nuevamente.
SequelizeJS es un ORM que ofrece conectividad a bases de datos relacionales como MySQL, PostgreSQL y MSSQL. Para este artículo, voy a usar MySQL alojado en RemoteMySQL, pero puedes usar cualquier base de datos relacional que prefieras.
Comenzando
Asumiendo que tienes un proyecto de Nest listo para empezar. Comenzaremos instalando las siguientes dependencias:
npm install --save sequelize sequelize-typescript mysql2
npm install --save-dev @types/sequelize
Primero, pasaremos los detalles de la conexión a SequelizeJS. Podemos hacer esto creando un módulo de base de datos y un proveedor.
nest generate module database
nest generate provider database/database.providers
Aquí es donde agregaremos nuestros modelos de entidad a SequelizeJS. Estoy agregando los modelos ahora mismo (aunque aún no están creados), pero puedes hacerlo más adelante.
import { Module } from "@nestjs/common"
import { databaseProviders } from "./database.providers"
@Module({
providers: [...databaseProviders],
exports: [...databaseProviders],
})
export class DatabaseModule {}
He importado y agregado el modelo de usuario a la función addModels. Ahora exporta tu proveedor de base de datos para que pueda ser utilizado por cualquier módulo que necesite acceder a la base de datos a través de SequelizeJS.
import { User } from "./user.entity"
import { USER_REPOSITORY } from "../utils/constants"
export const userProviders = [
{
provide: USER_REPOSITORY,
useValue: User,
},
]
Modelo de Entidad de Usuario
import { Injectable, Inject } from "@nestjs/common"
import { USER_REPOSITORY } from "../utils/constants"
import { User } from "./user.entity"
import { CreateUserDto } from "./dto/index"
@Injectable()
export class UserService {
constructor(
@Inject(USER_REPOSITORY) private readonly userRepository: typeof User
) {}
async getAllUsers(): Promise<User[]> {
return await this.userRepository.findAll<User>()
}
async createUser(createUser: CreateUserDto): Promise<User> {
return await this.userRepository.create<User>(createUser)
}
}
No voy a explicar cómo el código anterior llena la tabla de la base de datos y sus atributos. Si estás interesado en aprender más sobre SequelizeJS, puedes mirar aquí.
A continuación, crearemos user.provider.ts
que se usará para exportar el modelo de Usuario para que pueda ser utilizado en diferentes servicios.
import { User } from "./user.entity"
import { USER_REPOSITORY } from "../utils/constants"
export const userProviders = [
{
provide: USER_REPOSITORY,
useValue: User,
},
]
El USER_REPOSITORY
se almacena en una variable constante, en un archivo separado, para que pueda ser utilizado en cualquier parte sin estar sujeto a errores humanos.
En este punto, hemos terminado con nuestra configuración de la base de datos y SequelizeJS. De ahora en adelante, es solo cuestión de importar la base de datos y sus modelos y usarlos 😀.
Continuemos con el código
Vamos a crear nuestro módulo, controlador y servicio de usuario con el siguiente comando.
nest generate module user
nest generate controller user
nest generate service user
Estos son los archivos responsables de atender las solicitudes recurrentes a la base de datos. Pero primero crearemos un Objeto de Transferencia de Datos (DTO), esto es especialmente útil para validar el cuerpo de la solicitud HTTP entrante o para construir documentación de API con Swagger, etc.
export class CreateUserDto {
readonly name: string
readonly age: number
readonly email: string
}