En este artículo presentamos TypeORM, una herramienta para el trabajo con bases de datos a más alto nivel, con capa de abstracción y el patrón Active Record. Te explicaremos qué es TypeORM y cómo integrar la herramienta en un proyecto Nest.
Llegamos a un punto muy relevante en el Manual de Nest Framework, pues vamos a comenzar una tarea tan importante como el trabajo con las bases de datos. Primero cabe aclarar que Nest permite trabajar con cualquier base de datos que esté soportada en Node y por supuesto puedes aplicar cualquier mecanismo de acceso a las bases de datos que desees, por ejemplo usando las librerías oficiales de los motores de bases de datos o librerías adicionales que te permitan un acceso a más alto nivel.
Sin embargo, generalmente cuando desarrollamos con un framework acabamos usando herramientas como ORMs que están integrados en el propio framework y que nos permiten en muchos casos abstraernos del motor de base de datos con el que vamos a trabajar, incluso con el hecho de que los datos estén almacenados en registros de tablas. En el caso particular de Nest, permite adoptar cualquier herramienta disponible en Node, aunque tradicionalmente en este framework se viene usando TypeORM y la documentación que encontraremos en Internet casi siempre es relativa a este ORM.
Qué es TypeORM
TypeORM es un ORM para NodeJS, capaz de funcionar en muchos ambientes, como el propio Node, Cordova, Ionic, Electron y por supuesto NestJS. Es una herramienta que permite trabajar con diversas bases de datos, ayudando no sólo gracias a su capa de abstracción, sino también a la hora de montar las consultas y realizar operaciones con los datos.
TypeORM funciona bajo el patrón de Active Record y Data Mapper por lo que es fácil que se adapte a las necesidades y costumbres de distintos tipos de desarrolladores. Por supuesto, si ya tienes idea de lo que es un ORM ayudará mucho a la hora de aprender a usar TypeORM, ya que en el fondo está muy influenciado por otros ORM más tradicionales como Hibernate, Doctrine o Entity Framework.
En este artículo vamos a explicar cómo instalar TypeORM y cómo dar los primeros pasos en una aplicación de Nest.
Usaremos MySQL como sistema gestor de base de datos, aunque dada la abstracción de la base de datos que nos ofrece el ORM sería posible usar cualquier otro motor simplemente cambiando las opciones de conexión.
Instalar TypeORM
Comenzamos por instalar TypeORM en nuestro proyecto NestJS. Lo podemos hacer mediante el comando siguiente.
npm i @nestjs/typeorm mysql2 typeorm
Con esto estaremos instalando, de una vez, el paquete de Nest para usar TypeORM, el propio TypeORM y además el módulo de trabajo con MySQL.
Configurar TypeORM en la aplicación Nest
A continuación podemos comenzar a usar TypeORM dentro de una aplicación Nest, para lo que necesitaremos instalar un nuevo módulo llamado ´´´TypeOrmModule´´´ que depende de nuestro módulo principal, es decir, el archivo app.module.ts
.
Por supuesto, vamos a tener que importar este módulo de uso de TypeORM:
import { TypeOrmModule } from '@nestjs/typeorm';
Luego vamos a usarlo en el array que preparamos con la lista de módulos.
@Module({
imports: [ProductsModule, TagsModule, TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'mi_usuario',
password: 'secret',
database: 'nestdb',
})],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
Como puedes ver, el uso de TypeOrmModule
implica enviar al módulo toda una serie de configuraciones de acceso a la base de datos. Todas estas configuraciones las enviamos en modo de objeto por medio de un parámetro al método forRoot()
del módulo. Son las siguientes:
- type: 'mysql', para indicarle el tipo de conexión, es decir, el motor de la base de datos.
- host: 'localhost', para indicarle el servidor. Aquí podrías poner también la IP del servidor, en caso que esté en otra máquina el sistema gestor.
- port: 3306, para indicar el puerto donde nos comunicaremos con MySQL
- username: 'mi_usuario', para indicar el nombre de usuario con el que nos conectaremos a MySQL.
- password: 'secret', para indicar la clave del usuario
- database: 'nestdb', para especificar el nombre de la base de datos a la que nos conectaremos.
Por supuesto vas a necesitar un MySQL disponible para que todo funcione correctamente. Da igual cómo tengas instalado MySQL, si en el ordenador de trabajo, en un contenedor, en otra máquina, etc.
Ahora podemos arrancar la aplicación para comprobar si estos cambios han tenido éxito.
npm run start:dev
Si tenemos cualquier problema de conexión con la base de datos nos lo informarán en la consola al intentar arrancar nuestro proyecto Nest. Aparecerá un mensaje bien claro, indicando que no ha sido posible conectar con la base de datos.
ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
Error: ER_ACCESS_DENIED_ERROR: Access denied for user…
Si la aplicación arranca normalmente, es que ya tenemos perfectamente configurado el ORM y podemos comenzar a usarlo en la aplicación.
Nota importante sobre las variables de configuración del acceso a la base de datos
Seguro que a más de uno le ha resultado raro que escribamos las variables de conexión con la base de datos directamente en el código. Por supuesto, no es una buena idea, por diversos motivos:
- Primero porque estamos exponiendo información sensible a cualquier persona que pueda acceder al código
- Porque todos los desarrolladores tendrán entornos distintos con instalaciones distintas de MySQL, no necesariamente funcionando en el mismo host o con las mismas claves o usuarios.
- Porque en producción generalmente tendrás otros datos de conexión distintos a los que tienes en el servidor de desarrollo.
Para solucionar estos inconvenientes tenemos las variables de entorno en las aplicaciones. No las vamos a ver ahora, pues realizaremos las explicaciones en el debido momento, pero ten presente que esta forma de escribir los datos de conexión no es la más adecuada.
Otras configuraciones de TypeORM
Además de los datos de conexión con la base de datos, es posible indicar a TypeORM otra serie de configuraciones útiles. Estas se realizan en el mismo objeto de configuración y existen una cantidad de ellas.
Las opciones de configuración vienen derivadas del método createConnection() existente en TypeORM, que podemos ver en la página de documentación de TypeORM.
Además, Nest introduce otras opciones de configuración que podemos usar para facilitarnos aún más las cosas, que podemos encontrar en la documentación de Nest.
Por ejemplo, tenemos algunas configuraciones útiles indicadas en este nuevo código de conexión.
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'mi_usuario',
password: 'secret',
database: 'nestdb',
retryDelay: 3000,
autoLoadEntities: true,
})
En este caso estamos indicado adicionalmente:
- retryDelay: que queremos que pasen 3 segundos entre intento e intento de conexión.
- autoLoadEntities: que queremos que se carguen automáticamente las entidades al arrancar.
Conclusión
Con estas configuraciones iniciales podemos comenzar a trabajar. Nos faltan algunas cosas importantes, como la gestión de variables de entorno, pero eso no nos quita que podamos comenzar a experimentar con TypeORM.
En futuros artículos iremos introduciendo algunos de los fundamentos de este ORM para comenzar a soltarnos con él, comenzando por estudiar qué son las entidades.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...