Mi primera aplicacion con Nest.js
Tags: nestjs, node, javascript, api
Published: 2020-09-03 20:35:47

[Configuración de Dockerfile para proyecto Nest.js: tutorial práctico](https://edulixir.com/2024/06/21/configuracion-de-dockerfile-para-proyecto-nest-js-tutorial-practico/)

_Si estas interesado un probar nuevas tecnologías quizás este post sea de tu interés. Hoy vengo a hablarte de [Nestjs](https://nestjs.com/). Es un framework de nodejs que se basa en angular._

Esto quiere decir que viene con typescript, puedes implementar módulos como en angular, usar pipes, interceptor y mucho más...

Si te ha tocado configurar una aplicación en nodejs que tenga typescript, sabes que hay que hacer varias configuraciones. Como por ejemplo usar ts-node y un par de cosas más. O instalar paquetes adicionales como por ejemplo routing-controllers, si lo conoces.

La buena noticia es que nestjs, ya hace todo eso por ti. Viene con typescript, usa routing-controller y por defecto usa express, entonces que no tienes que preocuparte por configurar nada de eso.

### Ejemplo con Nest.js
{% github ronnymedina/nest-example %}

{% youtube QxDEVOYVv_w %}

### Instalar el clic y crear un nuevo proyecto

```
npm i -g @nestjs/cli // instalar el clic

nest new example // crear el proyecto

cd example // navegar hacia el proyecto

npm run start:dev // run server 
```

Con esto su servidor debe estar funcionando en [http://localhost:3000/](http://localhost:3000/), y debe tener algo como esto en su directorio.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/40xjd4v2jmmx83b9o3sx.png)

Para este ejemplo vamos a simular un endpoint de usuario, vamos a implementar la siguiente estructura de carpetas src/apis/users, ahí colocaremos todo lo correspondiente a users.

### Crear un archivo con el siguiente nombre users.controller.ts

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/u8uylzjw0qmaebp3b4zt.png)

Para mantener las cosas ordenadas, vamos a crear nuestro primer modulo. Como en angular podemos hacer módulos en nest también, con esto podemos mantener todas las dependencias necesarias que necesite nuestro modulo.

### Crear un index.ts

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/nmcwbv3causw1ggcl8rd.png)

### Importar nuestro modulo de users en app.module

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/db8emaeg75fbq4g6gogr.png)

Con eso debes poder navegar a la siguiente ruta http://localhost:3000/users/test. Ahora vamos simular nuestro service.

En nestjs a pesar que tiene varios paquetes que nos proveen soluciones, no vienen instalados por defecto, entonces nosotros debemos hacer la instalación manual, debemos instalar 2 paquetes necesarios para gestionar las validaciones.

- npm i class-validator --save
- npm i class-transformer --save

### Crear un user.entity.ts

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/lf8x2ljixnht0vxrsq47.png)

### Crear un create.user.dto.ts

[Class validator](https://github.com/typestack/class-validator) nos permite hacer validaciones mediante clases.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/zb4cisx8h24emheylqsk.png)

### user.service.ts

El user.service.ts usa un decorador @Injectable(), con esto nos permite llamar a la clase mediante inyección de dependencias.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/8t7b9r6wt5o9b19xydaz.png)

### Resultado de nuestro users.controller.ts

Si se fijan estamos llamando a nuestro user.service en el constructor mediante la inyección de dependencias y nuestro método create recibe un parámetro que es la data enviada, y como es de tipo CreateUserDto automáticamente esto se ejecuta como un middleware que valida nuestra información antes que llegue a ejecutar nuestro método create.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/e8lo4x4wvq78o8b2e3p7.png)

Nuestro modulo user debemos indicar el servicio, si no la inyección de dependencias no funcionara.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/1j4355jpr175zg2ijl06.png)

Y por último nuestro main.js debe tener activado las validaciones.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/l5qyvj9r6gx96a8vfsby.png)

Espero que te haya gustado, puedes ver el ejemplo completo en mi [github](https://github.com/ronnymedina) con swagger y compodoc.

Una ultima mención es que si quieres integrar sequelize y tienes problemas debes usar la versión 5 ya que sequelize 6 no soporta typescript o si al correr los test con jest se produce un error bajar la versión de jest a la 24.

Si quieres ver otra implementación con base datos, solo házmelo saber mediante los comentarios.