APIREST FUL NODEJS

Ejercicio de creación de una API Rest full en NodeJS

View on GitHub

APIREST FUL NODEJS

Descripción

Esta aplicación la podemos ver funcionando en demoapinode.isortegah.com/api-docs Nota: Se encuentra desplegada como contenedor Docker.

Índex

Pre requisitos

  • Creación de proyecto
    • Inicializar proyecto -> npm init
    • Inicializar control de versiones -> git init`

Swagger Node

  • Instalar swagger-node
    npm install -g swagger
    
  • Crear proyecto
    swagger project create apirest-ful-nodejs
    
  • Primera ejecución
    swagger project start
    

    ó

    node app.js
    

Referencias

Welcome to Swagger!

Swagger UI

Swagger UI

Se tiene la funcionalidad de Swagger UI para presentar el contenido del archivo swagger.ymlen una interfaz gráfica, pero yo busco que se sirva la misma interfaz bajo la misma api, es decir que si accedemos a <dominio>/api-docs se visualice uan interfaz para poder ejecutar los servicios desde la misma. Para ello utilizare Swagger-ui-express. Lo implementado lo describo acontinuación:

  • Intalar el middleware
npm install --save swagger-ui-express

Esta líbreria trabaja con tipo de archivo jsony el archivo que genera la libreria swagger node es con formato yaml , para solucionar este problema generé una función que lee el archivo yaml y escribe el json que requerimos, ademas ajusta el valor de la propiedad host que determina a donde se realizaran las peticiones que se lancen desde la interfaz swagger.

  • Constructor de json buildJsonSwagger.js

  • Agregar archivo routes.js ``javascript const swaggerUi = require(‘swagger-ui-express’); const swaggerDocument = require(‘./swagger.json’);

module.exports = ( app ) => { app.use(‘/api-docs’, swaggerUi.serve, swaggerUi.setup(swaggerDocument)); return app; }


* Ejecución con `Grunt` [Gruntfile.js](/apirest-ful-nodejs/Gruntfile.js)
```javascript
module.exports = ( grunt ) => {
    let environment = grunt.option('ENV') || 'LOCAL';
    grunt.registerTask( 'buildSwagger' , () => {
        console.log(environment)
        require('./api/libs/buildJsonSwagger')( 'LOCAL')
    });
}

Al ejecutar la aplicación se podrá ver la interfaz en la siguiente ruta: http://localhost:3000/api-docs

Referencias

Swagger-ui-express

Swagger UI

Dockerizado

  • Docker file ```docker FROM isortegah/nodejs_8_2_1:v1 ADD package.json /app/user/ ADD package-lock.json /app/user/ ADD api /app/user/ ADD config /app/user/

WORKDIR /app/user RUN npm install

CMD node app.js


* Construcción de imagen

docker build -t api-node .


* Ejecución de imagen

docker run -it -p 3000:3000 < id imagen >


* Borrado de contenedores 

docker ps -a | egrep Exited | cut -d ‘ ‘ -f 1|xargs docker rm


* Borrar imagenes < none >

docker images | egrep none | cut -c 41-53| xargs docker rmi


## Heroku

Pre requisitos
* Instalación de [Heroku Cli](https://devcenter.heroku.com/articles/heroku-cli)

* Crear app en Heroku

heroku create < nombre app >

* Establecer buildpack

heroku buildpacks:set heroku/nodejs –app api-rest-node-io



**Despliegue en heroku como docker**

* Instalar plugin

heroku plugins:install heroku-container-registry

* Login en contenedor

heroku container:login

* Push codigo

heroku container:push web –app api-rest-node-io

* Correr bash en heroku

heroku run bash

**Referencia:**   

[Container Registry and Runtime](https://devcenter.heroku.com/articles/container-registry-and-runtime)

[Push multiple Docker images to Heroku Container Registry](https://devcenter.heroku.com/changelog-items/1191)

[Container Registry and Runtime | Heroku Dev Center](https://devcenter.heroku.com/articles/container-registry-and-runtime)

## Toke con JWT

* Para desarrollo crear archivo `.env` con la siguiente variable:

SECRET=”frase secreta” ```