{"id":19928384,"url":"https://github.com/rudemex/node-express-starter","last_synced_at":"2026-04-01T20:43:15.247Z","repository":{"id":54515943,"uuid":"329300446","full_name":"rudemex/node-express-starter","owner":"rudemex","description":"Starter server express node.js","archived":false,"fork":false,"pushed_at":"2021-08-25T23:14:46.000Z","size":236,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-03T10:42:19.556Z","etag":null,"topics":["backend-for-frontend","bff","ecmascript","express","javascript","microservice","node","nodejs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rudemex.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"license.md","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"custom":["https://www.linkedin.com/in/rudemex","https://www.instagram.com/rudemex/","https://twitter.com/rudemex/","https://paypal.me/rudemex"]}},"created_at":"2021-01-13T12:25:19.000Z","updated_at":"2022-11-07T23:40:15.000Z","dependencies_parsed_at":"2022-08-13T18:20:49.054Z","dependency_job_id":null,"html_url":"https://github.com/rudemex/node-express-starter","commit_stats":null,"previous_names":[],"tags_count":1,"template":true,"template_full_name":null,"purl":"pkg:github/rudemex/node-express-starter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudemex%2Fnode-express-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudemex%2Fnode-express-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudemex%2Fnode-express-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudemex%2Fnode-express-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rudemex","download_url":"https://codeload.github.com/rudemex/node-express-starter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudemex%2Fnode-express-starter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291777,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend-for-frontend","bff","ecmascript","express","javascript","microservice","node","nodejs"],"created_at":"2024-11-12T22:37:04.687Z","updated_at":"2026-04-01T20:43:15.223Z","avatar_url":"https://github.com/rudemex.png","language":"JavaScript","funding_links":["https://www.linkedin.com/in/rudemex","https://www.instagram.com/rudemex/","https://twitter.com/rudemex/","https://paypal.me/rudemex"],"categories":[],"sub_categories":[],"readme":"\u003c!--\u003ch1 align=\"center\"\u003eSimple Node TypeScript Express Starter\u003ch1/\u003e--\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg alt=\"node-express-starter\" width=\"100%\" height=\"auto\" src=\"https://socialify.git.ci/rudemex/node-express-starter/image?font=Inter\u0026language=1\u0026pattern=Signal\u0026theme=Light\" /\u003e\n\u003c/p\u003e\n\n\u003c!--\u003cp align=\"center\"\u003e\n    \u003cimg alt=\"node-express-starter\" width=\"100%\" height=\"auto\" src=\"https://socialify.git.ci/rudemex/node-express-starter/image?font=Inter\u0026language=1\u0026pattern=Signal\u0026theme=Light\" /\u003e\n\u003c/p\u003e--\u003e\n\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://img.shields.io/static/v1.svg?label=Node\u0026message=v10.15.3\u0026labelColor=339933\u0026color=757575\u0026logoColor=FFFFFF\u0026logo=node.js\" alt=\"Node.js website\"/\u003e\n    \u003cimg src=\"https://img.shields.io/static/v1.svg?label=Npm\u0026message=v6.4.1\u0026labelColor=CB3837\u0026logoColor=FFFFFF\u0026color=757575\u0026logo=npm\" alt=\"Npm website\"/\u003e\n    \u003cimg src=\"https://img.shields.io/static/v1.svg?label=Express\u0026message=v4.17.1\u0026labelColor=444\u0026logoColor=FFFFFF\u0026color=757575\u0026logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAMFBMVEX////q6uqgoaEZGhtzc3SSk5Ourq5hYmLHx8f09PVOTk+7u7vf39+DhITT09M3ODgiPZ4kAAAAuUlEQVR42u2RyxbDIAhE0fEVjfL/fxu0YNJFF123d0E4iEMY6c83OA/BO0kDohYTstupUoiOikaTEzjv8+5EpgODaKAeJGQk02ekLbpikBglKh7d0o6x7jZqU0epe5aU05LkUTH2BqhknAivPsA/ik8yTYJ8PzSw/jYGGc66bzLeJJhvNZ90z4hIRkeyNKCZU2aoUMBuG7W8LqRtSgT8oVbra+kgI9gKxey2xzBKn8dTprDOW4YW+hUuT8sFbvZNU3wAAAAASUVORK5CYII=\" alt=\"ExpressJS website\"/\u003e\n    \u003cimg alt=\"GitHub Workflow Status\" src=\"https://github.com/rudemex/node-express-starter/actions/workflows/build.yml/badge.svg?branch=master\"\u003e\n    \u003cimg alt=\"Codecov\" src=\"https://img.shields.io/codecov/c/github/rudemex/node-express-starter?logoColor=FFFFFF\u0026logo=Codecov\u0026labelColor=#F01F7A\"\u003e\n    \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=rudemex_node-express-starter\u0026metric=alert_status\" alt=\"sonarcloud\"\u003e    \n    \u003cimg alt=\"GitHub\" src=\"https://img.shields.io/github/license/rudemex/node-express-starter\"\u003e\n    \u003cbr/\u003e \n\u003c/p\u003e\n\n## Glosario\n\n- [📝 Requerimientos básicos](#basic-requirements)\n- [🛠️ Instalar dependencias](#install-dependencies)\n- [⚙️ Configuración](#configurations)\n- [💻 Scripts](#scripts)\n- [📚 Swagger](#swagger-info)\n- [📤 Commits](#commits)\n- [😝 Mocks](#mocks)\n\n---\n\n\u003ca name=\"basic-requirements\"\u003e\u003c/a\u003e\n\n#### 📝 Requerimientos básicos\n\n- Node.js v10.15.3 or higher ([Download](https://nodejs.org/es/download/))\n- NPM v6.4.1 or higher\n- [Mock Json Server](https://www.npmjs.com/package/mock-json-server)\n\n\u003ca name=\"install-dependencies\"\u003e\u003c/a\u003e\n\n#### 🛠 Instalar dependencias\n\nCuando tenemos los requisitos básicos, clonamos el repositorio, vamos a la carpeta del proyecto e instalamos sus\ndependencias.\n\n```\n npm install\n```\n\n\u003ca name=\"configurations\"\u003e\u003c/a\u003e\n\n## ⚙️ Configuración\n\nEsta aplicación utiliza la dependencia de [config](https://www.npmjs.com/package/config) para facilitar la configuración\nde las variables del entorno, lo que la hace escalable y robusta al desplegar la aplicación en diferentes entornos.\n\nEn el directorio `./config` se encuentra un archivo llamado `development.json` que contiene la configuración para un\nentorno local, mientras que el archivo `custom-environment-variables.json`\nobtiene los valores por medio de los `key` definidos en las variables de entorno que se configuran en el\nel servidor.\n\nBásicamente el archivo funciona como un objeto que se exporta y puede ser consumido invocándolo en el archivo que\nrequiere utilizar la información cargada. Si se necesita añadir más datos para consumir, como la conexión a una base de\ndatos, a una redis, la url de algún micro-servicio, API, etc. sólo hay que añadirlo en los archivos mencionados manteniendo el\nesquema.\n\n```json5\n{\n  \"server\": {\n    \"port\": 8080,\n    \"context\": \"/api\",\n    \"origins\": \"http://localhost:3000,http://localhost:3001,http://localhost:8080\",\n    \"originsReadOnly\": \"http://localhost:3001\",\n    \"headersAllowed\": \"Content-Type,Authorization,Set-Cookie,Access-Control-Allow-Origin,Cache-Control,Pragma\",\n    \"methodsAllowed\": \"GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS\",\n    \"corsCredentials\": \"false\",\n    \"corsEnabled\": \"true\",\n    \"tz\": \"America/Argentina/Buenos_Aires\",\n    \"showLogInterceptor\": \"false\",\n    \"enabledLogs\": \"true\"\n  },\n  \"swagger\": {\n    \"path\":'api-docs',\n    \"enabled\": \"true\"\n  },\n  \"params\": {\n  },\n  \"services\": {\n  }\n}\n\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e🤓 Ver todas las propiedades de configuración disponibles en detalle.\u003c/summary\u003e\n\n#### Server\n\n`port`: Es el puerto por el cual va a correr el servidor.\n\n- Type: `Number`\n- Default: `8080`\n\n`context`: Es el contexto el que se puede acceder a la API del servidor, de esta manera no se exponen los endpoints en\nla ruta principal de la aplicación.\n\n- Type: `String`\n- Default: `/api`\n\n`origins`: Es una whitelist para que la aplicación sólo pueda ser consumida por urls confiables y evitar cualquier tipo\nde solicitudes no deseadas y maliciosas. Debes escribir las urls separadas por una coma.\n\n- Type: `String`\n- Default: `http://localhost:3000,http://localhost:3001,http://localhost:8080`\n\n`originsReadOnly`: Es la configuración de las urls para **CORS**, lo que permite validar quién puede consumir el\nservidor.\n\n- Type: `String`\n- Default: `http://localhost:3001`\n\n`headersAllowed`: Parámetros que va a recibir por el header en los request.\n\n- Type: `String`\n- Default: `Content-Type,Authorization,Set-Cookie,Access-Control-Allow-Origin,Cache-Control,Pragma`\n\n`methodsAllowed`: Métodos http disponibles para el cors\n\n- Type: `String`\n- Default: `GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS`\n\n`corsCredentials`: Habilita o deshabilita el uso de las credenciales en las peticiones CORS en el servidor.\n\n- Type: `Boolean`\n- Default: `false`\n\n`corsEnabled`: Habilita o deshabilita el uso de CORS en el servidor.\n\n- Type: `Boolean`\n- Default: `false`\n\n`tz`: Es la configuración de la zona horaria para el servidor. [Lista de zonas horarias](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List)\n\n- Type: `String`\n- Default: `America/Argentina/Buenos_Aires`\n\n\n`showLogInterceptor`: Habilita o deshabilita la visualización de los interceptors de los requests y responses por medio de logs.\n\n- Type: `Boolean`\n- Default: `false`\n\n`enabledLogs`: Habilita o deshabilita los logs de la aplicación.\n\n- Type: `Boolean`\n- Default: `true`\n\n#### Swagger\n\n`path`: Define la ruta de la documentación **Swagger**, se escribe sin el `/` (slash).\n\n- Type: `String`\n- Default: `api-docs`\n\n`enabled`: Habilitar o deshabilitar la documentación **Swagger** de los endpoints del servidor.\n\n- Type: `Boolean`\n- Default: `true`\n\n#### Params\n\nConfiguración de parámetros a utilizar en la aplicación, manteniendo el esquema `key:value`.\n\n```json5\n{\n  ...\n  \"params\": {\n    \"my-param\": \"\u003cparam-value\u003e\"\n  },\n  ...\n}\n```\n\n#### Services\n\nEs donde se va a colocar las urls de los micro-servicios a consumir, manteniendo el esquema `key:value`.\n\n```json5\n{\n  ...\n  \"services\": {\n    \"my-microservice\": \"\u003curl-my-microservice\u003e\"\n  },\n  ...\n}\n```\n\n\u003c/details\u003e\n\n\u003ca name=\"scriptsr\"\u003e\u003c/a\u003e\n\n## 💻 Scripts\n\n#### Local o Desarrollo\n\nInicia la aplicación en modo desarrollo usando `nodemon` y `node` para hacer hot reloading. \n\n```\nnpm run dev\n```\n\n#### Server Mock\n\nEjecuta la aplicación mockeada.\n\n```\nnpm run mock\n```\n\n#### Producción\n\nInicia la aplicación en modo producción.\n\n```\nnpm run start\n```\n\n#### Test\n\nInicia la fake app para correr los unit test con **Jest** y retorna el coverage.\n\n```\nnpm run test\n```\n\n\u003ca name=\"swagger-info\"\u003e\u003c/a\u003e\n\n## 📚 Swagger\n\nEl proyecto cuenta con un **Swagger** que tiene documentado los endpoints con sus definiciones.\n\nPara documentar los nuevos endpoints, se debe completar con la información de los mismos con la anotación en **YAML** en\nel archivo `api-swagger.yaml` que está en el root del proyecto.\n\nEsta documentación puede ser activada o desactivada desde el archivo de configuración o en las variables de entorno del proyecto.\n\n```json5\n// ./config/development.json\n{\n  ...\n  \"swagger\": {\n    \"path\": 'api-docs',\n    \"enabled\": \"true\"\n  },\n  ...\n}\n```\n\n```js\n// ENV\nSWAGGER_PATH=api-docs\nSWAGGER_ENABLED=true;\n```\n\n#### URL\n\nAcceso a la documentación y testeo de los endpoints: `http://localhost:8080/api-docs`\n\n#### Scheme\n\n```\n\u003chttp|https\u003e://\u003cserver_url\u003e\u003c:port\u003e/\u003cpath\u003e\n```\n\u003ca name=\"commits\"\u003e\u003c/a\u003e\n## 📤 Commits\n\nPara los mensajes de commits se toma como referencia [`conventional commits`](https://www.conventionalcommits.org/en/v1.0.0-beta.4/#summary).\n\n```\n\u003ctype\u003e[optional scope]: \u003cdescription\u003e\n\n[optional body]\n\n[optional footer]\n```\n\n- **type:** chore, docs, feat, fix, refactor (más comunes)\n- **scope:** indica la página, componente, funcionalidad\n- **description:** comienza en minúsculas y no debe superar los 72 caracteres.\n\n\u003ca name=\"mocks\"\u003e\u003c/a\u003e\n\n## 😝 Mocks\n\nPara generar el **Mock** del endpoint, hay que generar un archivo **javascript** dentro del directorio `./mock/api`\ncorrespondiente al endpoint.\n\nEl archivo del **mock** es un objeto `json` exportado como modulo, el cual tiene que tener la definición de la ruta, el\nmétodo, el parámetro (en caso de que sea necesario), y la respuesta.\n\n```js\n// ./mock/api/posts.js\n\nmodule.exports = {\n    '/api/posts': {\n        get: [\n            {\n                userId: 1,\n                id: 1,\n                title:\n                    'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',\n                body:\n                    'quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto',\n            },\n            ...{\n                userId: 1,\n                id: 2,\n                title: 'qui est esse',\n                body:\n                    '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',\n            },\n        ],\n        post: {\n            userId: 1,\n            id: 1,\n            title:\n                'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',\n            body:\n                'quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto',\n        },\n    },\n    '/api/posts/:id': {\n        get: {\n            userId: 1,\n            id: 1,\n            title: 'eum et est occaecati',\n            body:\n                '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',\n        },\n    },\n};\n```\n\nUna vez generado el archivo con la definición del endpoint junto a su respuesta, hay que requerirlo en el\narchivo `routes.js` que se encuentra en `./mock/api`.\n\n```js\n// ./mock/api/routes.js\n\nconst routes = {\n    ...require('./posts'),\n    ...\n    ...require('./another-end-point'),\n};\n\nmodule.exports = routes;\n\n```\n\n---\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"mailto:mdelgado@tresdoce.com.ar\" target=\"_blank\" alt=\"Send an email\"\u003e\n        \u003cimg src=\"./.readme-static/logo-mex-red.svg\" width=\"120\" alt=\"Mex\" /\u003e\n    \u003c/a\u003e\u003cbr/\u003e\n    \u003c!--\u003ca href=\"mailto:mdelgado@tresdoce.com.ar\" target=\"_blank\" alt=\"Send an email\"\u003e\n        \u003cimg src=\"https://img.shields.io/static/v1.svg?style=flat-square\u0026label=\u0026message=Sr.%20Fullstack%20Developer\u0026labelColor=1A1A1A\u0026color=999999\u0026logo=hackaday\" alt=\"Mex Delgado\" /\u003e\n    \u003c/a\u003e\u003cbr/\u003e\u003cbr/\u003e--\u003e\n    \u003cp\u003eMade with ❤\u003c/p\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frudemex%2Fnode-express-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frudemex%2Fnode-express-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frudemex%2Fnode-express-starter/lists"}