Creando un API REST con swagger Node (parte 7)

Completando el desarrollo con logs, fichero de configuración y refactorización del arranque

Diego Pérez Molinero
4 min readOct 18, 2018

Tras un tiempo de inactividad en el tutorial de API REST, que casi se ha convertido más bien en un tutorial de backend de NodeJs, vuelvo con energías renovadas a explicar brevemente una serie de características que deberíamos añadir a nuestro API REST (o aplicación de backend de NodeJS).

En este capítulo implementaremos un logger para nuestra aplicación y además, introduciremos un fichero de configuración que nos servirá para evitar tener que “hardcodear” ciertos parámetros de configuración.

Logger enriquecido para nuestra aplicación

Una parte muy importante de nuestra aplicación es tener una trazabilidad en el entorno de ejecución de lo que va sucediendo a lo largo del tiempo. Para ello, hemos creado un logger basado en log-color.

En cada una de las trazas, además queremos que aparezca el nombre del módulo y el método que se ejecuta. Aparte la librería log-color, nos va a mostrar información del momento en que se ha producido la ejecución.

log.helper.js

Un ejemplo de traza de la aplicación durante el arranque:

Ejemplo de traza con log-color durante el arranque

Aplicando el logger a cada una de las capas de la aplicación, conviene poder trazar los parámetros que entran a la función, así como la salida que devuelve.

Por ejemplo, en un controller:

Logger aplicado al GameSystem Controller

Aplicado en un service:

Logger aplicado al GameSystem Service

Y en la capa de persistencia, un repository:

Logger aplicado al GameSystem Repository

Fichero de configuración de la aplicación

Es importante considerar el aspecto de que nuestro código debería poder ejecutarse en distintos entornos de ejecución (desarrollo, certificación, preproducción o producción) sin tener que cambiar una línea de código.

Para lograrlo hemos añadido soporte a la carga de un fichero de configuración, donde vamos a poder añadir propiedades en función del entorno de ejecución, que no deberían ir “hardcodeadas” dentro de la aplicación.

Mediante el servicio de configuración, podemos cargar la configuración tanto de un fichero local en formato .yml o bien poder usar un fichero subido a un repositorio GIT.

La implementación de este servicio, se ha realizado en el módulo config.service.js

Durante el arranque de la aplicación, elegimos mediante un script previo, si queremos cargar la configuración de un fichero local o bien de GIT.

Fichero de configuración init_yaml.sh

Fichero de configuración init_yaml.sh

Fichero de configuración init_git.sh

Fichero de configuración init_git.sh

Cómo cargar la configuración

Si queremos cargar del fichero de configuración definido dentro del init_yaml.sh, basta con ejecutar:

source ./init_yaml.sh
swagger project start

En cambio, si queremos cargar la configuración del fichero desde un repositorio GIT, primero hemos de arrancar el servicio springcloudconfigserver, que se encuentra en la carpeta siguiente:

/gamecollector-miscelanea/docker-compose/local

Allí tenemos el fichero dc-services.yml

Para arrancarlo, con docker y docker-compose instalado ya en nuestra máquina previamente, basta con ejecutar:

docker-compose -f dc-services.yml up -d

Y a continuación, con el servicio ya arrancado y escuchando por el puerto 8888, hacemos, desde el directorio gamecollector-backend

source ./init_git.sh
swagger project start

Refactorización del arranque de la aplicación

Anteriormente, teníamos todo el arranque en el fichero app.js, ahora lo hemos separado en una serie de módulos de arranque, que hemos agrupado en la carpeta de bootstrap, con lo que el módulo principal de arranque app.js ha quedado así de simple:

Nuevo app.js

Hemos desacoplado el arranque de la aplicación de la implementación propiamente dicha de los servicios que se arrancan, intentando acercarnos a una arquitectura más limpia y fácilmente testeable.

Ahora ejecutamos los tres pasos que necesitamos, de forma diferenciada:

  • Load Config
  • Set Trace Level
  • Start Swagger

Y esto es todo, se que ha sido algo denso, pero espero que haya sido de interés.

Finalmente, dejo como siempre el enlace al repositorio de github para poder descargar el código completo.

--

--

Diego Pérez Molinero

Software Architect & defender of clean architecture and domain driven design. Supporter of infrastructure & devops as code into the projects.