API Rest con NodeJS

Sebastian Catalan Araya
3 min readMar 26, 2021

--

Vamos a crear una API Rest básica en node, utilizando algunas librerias para ayudarnos. Poco a poco iremos integrando mas funcionalidades.

No profundizaremos en el paso a paso. Para ello hay videos y documentos que lo explican de manera muy clara.

Vamos a enfocarnos un poco mas en los detalles y en como interactuaran las peticiones con cada uno de nuestros componentes.

Podemos descargar el proyecto completo del siguiente repositorio en gitlab: https://github.com/catalanseb/api_node/tree/basic-structure.

Ire creando una nueva rama por cada publicación que creemos. Asi no perdemos el hilo y no nos cae todo de golpe ;)

Iniciemos

Partiremos con nuestro package.json y la declaración de nuestras librerias a utilizar:

Express: Sera nuestro framework, el cual nos ayudara a tener un desarollo mucho mas agil y rapido. Puedes revisar la documentación en: https://expressjs.com/

Awilix: Nos ayudara con la inyección de dependencias de nuestros componentes, tambien aplicaremos el patron de diseño singleton para que nuestras clases sean instanciadas una sola vez. Más adelante escribiremos un poco mas sobre patrones de diseño.

También como paquetes de desarrollo ocuparemos dotenv para cargar nuestras variables de entorno y nodemon para poder editar sin tener que detener y arrancar nuevamente nuestro servidor.

Hemos creado una estructura de carpetas, en donde podremos ir separando por nombres nuestros componentes. Sean routes, controllers o mas adelante services o models.

Para poder utilizar la inyección de dependencias con awilix hemos creado un container en la ruta ./src/startup/container.js. En donde cada vez que creemos un componente, iremos a registrarlo al container.

Nuestro container tendra el siguiente codigo:

Utilizamos singleton para que nuestro componente siempre se reutilize. El contenedor almacena en cache el modulo resuelto inicialmente.

Flujo de nuestra API

Basicamente el flujo de nuestra API seria el siguiente:

Tenemos nuestros endpoints declarados en la carpeta ./src/routes, nuestras rutas reciben nuestra petición y segun el verbo HTTP de nuestro request es a la función del controlador a la cual se dirigiran.

Podemos ir implementando algunos middlewares antes de ir a los controladores, los cuales usaremos para ir creando reglas de negocio transversales a todos nuestros endpoind o a un grupo de ellos. Para ello los iremos declarando en la ruta ./src/middlewares.

Una vez en el controlador, podemos aplicar alguna logica de negocio, o llamar algun servicio para conectarnos a una base de datos o alguna otra API que necesitemos. Esto lo veremos mas adelante al escribir sobre como conectarnos a una base de datos y trabajar con algun ORM como Sequelize o TypeORM (o mongoose si nos vamos por el lado de NoSQL).

Por el momendo devolveremos una respuesta para saber que nuestra API esta respondiendo ok:

La creación de nuestro servidor la tenemos en la ruta ./src/startup/index.js y la instanciamos desde ./index.js que es nuestro punto de partida.

Seria algo mas o menos asi:

… Más adelante veremos como agregar servicios, crear permanencia de datos con algun ORM, pruebas unitarias, de integración y alguna otra cosa que se me puede haber pasado por ahí.

Tambien estoy preparando una API un poco mas robusta con TypeScript :)

--

--