Skip to content

rudemex/node-typescript-express-starter

Repository files navigation

node-typescript-express-starter

Node.js website Npm website ExpressJS website GitHub Workflow Status Codecov sonarcloud GitHub

Glosario


📝 Requerimientos básicos

🛠 Instalar dependencias

Cuando tenemos los requisitos básicos, clonamos el repositorio, vamos a la carpeta del proyecto e instalamos sus dependencias.

 npm install

⚙️ Configuración

Esta aplicación utiliza la dependencia de config para facilitar la configuración de las variables del entorno, lo que la hace escalable y robusta al desplegar la aplicación en diferentes entornos.

En el directorio ./config se encuentra un archivo llamado development.json que contiene la configuración para un entorno local, mientras que el archivo custom-environment-variables.json obtiene los valores por medio de los key definidos en las variables de entorno que se configuran en el el servidor.

Básicamente el archivo funciona como un objeto que se exporta y puede ser consumido invocándolo en el archivo que requiere utilizar la información cargada. Si se necesita añadir más datos para consumir, como la conexión a una base de datos, a una redis, la url de algún micro-servicio, API, etc. sólo hay que añadirlo en los archivos mencionados manteniendo el esquema.

{
  "server": {
    "port": 8080,
    "context": "/api",
    "origins": "http://localhost:3000,http://localhost:3001,http://localhost:8080",
    "originsReadOnly": "http://localhost:3001",
    "headersAllowed": "Content-Type,Authorization,Set-Cookie,Access-Control-Allow-Origin,Cache-Control,Pragma",
    "methodsAllowed": "GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS",
    "corsCredentials": "false",
    "corsEnabled": "true",
    "tz": "America/Argentina/Buenos_Aires",
    "showLogInterceptor": "false",
    "enabledLogs": "true"
  },
  "swagger": {
    "path":'api-docs',
    "enabled": "true"
  },
  "params": {
  },
  "services": {
  }
}
🤓 Ver todas las propiedades de configuración disponibles en detalle.

Server

port: Es el puerto por el cual va a correr el servidor.

  • Type: Number
  • Default: 8080

context: Es el contexto el que se puede acceder a la API del servidor, de esta manera no se exponen los endpoints en la ruta principal de la aplicación.

  • Type: String
  • Default: /api

origins: Es una whitelist para que la aplicación sólo pueda ser consumida por urls confiables y evitar cualquier tipo de solicitudes no deseadas y maliciosas. Debes escribir las urls separadas por una coma.

  • Type: String
  • Default: http://localhost:3000,http://localhost:3001,http://localhost:8080

originsReadOnly: Es la configuración de las urls para CORS, lo que permite validar quién puede consumir el servidor.

  • Type: String
  • Default: http://localhost:3001

headersAllowed: Parámetros que va a recibir por el header en los request.

  • Type: String

Default: Content-Type,Authorization,Set-Cookie,Access-Control-Allow-Origin,Cache-Control,Pragma

methodsAllowed: Métodos http disponibles para el cors

  • Type: String
  • Default: GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS

corsCredentials: Habilita o deshabilita el uso de las credenciales en las peticiones CORS en el servidor.

  • Type: Boolean
  • Default: false

corsEnabled: Habilita o deshabilita el uso de CORS en el servidor.

  • Type: Boolean
  • Default: false

tz: Es la configuración de la zona horaria para el servidor. Lista de zonas horarias

  • Type: String
  • Default: America/Argentina/Buenos_Aires

showLogInterceptor: Habilita o deshabilita la visualización de los interceptors de los requests y responses por medio de logs.

  • Type: Boolean
  • Default: false

enabledLogs: Habilita o deshabilita los logs de la aplicación.

  • Type: Boolean
  • Default: true

Swagger

path: Define la ruta de la documentación Swagger, se escribe sin el / (slash).

  • Type: String
  • Default: api-docs

enabled: Habilitar o deshabilitar la documentación Swagger de los endpoints del servidor.

  • Type: Boolean
  • Default: true

Params

Configuración de parámetros a utilizar en la aplicación, manteniendo el esquema key:value.

{
  ...
  "params": {
    "my-param": "<param-value>"
  },
  ...
}

Services

Es donde se va a colocar las urls de los micro-servicios a consumir, manteniendo el esquema key:value.

{
  ...
  "services": {
    "my-microservice": "<url-my-microservice>"
  },
  ...
}

💻 Scripts

Local o Desarrollo

Inicia la aplicación en modo desarrollo usando nodemon y ts-node para hacer hot reloading.

npm run dev

Server Mock

Ejecuta la aplicación mockeada.

npm run mock

Build

Transpile la aplicación limpiando primero la carpeta de destino ./dist.

npm run build

Producción

Inicia la aplicación de transpilada de la carpeta ./dist, se requiere previamente haber realizado el build.

npm run start

Test

Inicia la fake app para correr los unit test con Jest y retorna el coverage.

npm run test

📚 Swagger

El proyecto cuenta con un Swagger que tiene documentado los endpoints con sus definiciones.

Para documentar los nuevos endpoints, se debe completar con la información de los mismos con la anotación en YAML en el archivo api-swagger.yaml que está en el root del proyecto.

Esta documentación puede ser activada o desactivada desde el archivo de configuración o en las variables de entorno del proyecto.

// ./config/development.json
{
  ...
  "swagger": {
    "path": 'api-docs',
    "enabled": "true"
  },
  ...
}
// ENV
SWAGGER_PATH=api-docs
SWAGGER_ENABLED=true;

URL

Acceso a la documentación y testeo de los endpoints: http://localhost:8080/api-docs

Scheme

<http|https>://<server_url><:port>/<path>

📤 Commits

Para los mensajes de commits se toma como referencia conventional commits.

<type>[optional scope]: <description>

[optional body]

[optional footer]
  • type: chore, docs, feat, fix, refactor (más comunes)
  • scope: indica la página, componente, funcionalidad
  • description: comienza en minúsculas y no debe superar los 72 caracteres.

😝 Mocks

Para generar el Mock del endpoint, hay que generar un archivo javascript dentro del directorio ./mock/api correspondiente al endpoint.

El archivo del mock es un objeto json exportado como modulo, el cual tiene que tener la definición de la ruta, el método, el parámetro (en caso de que sea necesario), y la respuesta.

// ./mock/api/posts.js

module.exports = {
    '/api/posts': {
        get: [
            {
                userId: 1,
                id: 1,
                title:
                    'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',
                body:
                    'quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto',
            },
            ...{
                userId: 1,
                id: 2,
                title: 'qui est esse',
                body:
                    'est rerum tempore vitae sequi sint nihil reprehenderit dolor beatae ea dolores neque fugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis qui aperiam non debitis possimus qui neque nisi nulla',
            },
        ],
        post: {
            userId: 1,
            id: 1,
            title:
                'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',
            body:
                'quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto',
        },
    },
    '/api/posts/:id': {
        get: {
            userId: 1,
            id: 1,
            title: 'eum et est occaecati',
            body:
                'ullam et saepe reiciendis voluptatem adipisci sit amet autem assumenda provident rerum culpa quis hic commodi nesciunt rem tenetur doloremque ipsam iure quis sunt voluptatem rerum illo velit',
        },
    },
};

Una vez generado el archivo con la definición del endpoint junto a su respuesta, hay que requerirlo en el archivo routes.js que se encuentra en ./mock/api.

// ./mock/api/routes.js

const routes = {
    ...require('./posts'),
    ...
    ...require('./another-end-point'),
};

module.exports = routes;

Mex

Made with ❤