express-ts-api-boilerplate
v1.0.1
Published
Express Typescript API Boilerplate
Downloads
8
Maintainers
Readme
Express TypeScript API Boilerplate
Simple Express API boilerplate built with TypeScript.
Motivation
Main goal was to create a boilerplate for NodeJS projects built with TypeScript without having to spend long hours to setup development tools, build, linting and formatting tasks.
Technologies and Packages used
TypeScript, ES6, Express, TSLint, Dotenv, Prettier, Joi, Nodemon
Installation
git clone [email protected]:jbutko/express-ts-api-boilerplate.git
cd express-ts-api-boilerplate
yarn install // or npm install
Scripts
yarn run dev
- run the app in development mode, app will be reloaded on file changes
yarn run start
- start the app in non-reloadable mode
yarn run build
- build the app
yarn run lint
- check typescript errors via TSLint
yarn run lint:fix
- check and fix typescript errors via TSLint
yarn run format
- check for formatting errors via Prettier
yarn run format:fix
- fix formatting errors via Prettier
yarn run format:lint:fix
- check and fix typescript errors via TSLint and correct formatting errors via Prettier
Project directory structure example
│ .editorconfig // https://editorconfig.org/
│ .env // Base environment variables goes here. BEWARE: This one is commited in the repo, do not store sensitive variables here.
│ .env.local // Sensitive ENV variables goes here. Overrides variables from `/.env`. BEWARE: This one is not commited in the repo.
│ .gitignore // Git ignored files
│ .prettierignore // Prettier ignored files
│ .prettierrc // Prettier config file: no more tab/space bullshit with your collegues
│ LICENSE // License file, MIT of course
│ nodemon.json // Nodemon config file
│ package.json // App dependencies, project information and stuff...
│ pm2-process.json // PM2 process config file (start the app with command `pm2 start pm2-process.json`)
│ README.md // Project Readme
│ tsconfig.json // TypeScript config file
│ tslint.json // TypeScript linting config file
│ yarn.lock // Yarn lockfile => https://yarnpkg.com/blog/2016/11/24/lockfiles-for-all/
│
└───src // App root folder
│ index.ts // Main entry point: http server and express app initialization
│
├───app // App folder
│ │ App.routes.ts // Main express router: individual routers from `app/routers` folder are imported here
│ │ App.ts // Express app config: middlewares, router initialization, error handling initialization
│ │
│ ├───components // All components (entities) goes here
│ │ └───Common // Common component example
│ │ Common.controller.ts // API controller for `Common` component: API endpoint handlers goes here, keep it simple!
│ │ Common.validators.ts // Joi validation schemas. Imported in `app/routers` files.
│ │ Common.interface.ts // TypeScript interfaces/enums for `Common` component
│ │ Common.db.ts // Database access related code
│ │ Common.service.ts // Generic functions related to data processing or stuff that do not need db access
│ │ Common.middleware.ts // Express middleware functions: for example user auth token verification etc. Imported in `app/routers` files.
│ │ index.ts // Public API of `Common` component: CommonController, commonValidators etc.
│ │
│ ├───core // Core components: common logic that is used in more than one place of the app
│ │ Env.ts // Environment settings configuration through dotenv - variables from `/.env` and `./env.local` will be initialized here.
│ │ ErrorHandling.ts // Express error handler functions for prod/dev
│ │ Dates.ts // All dates/times related functions
│ │ index.ts // Public API of `core` folder: ENV, ErrorHandling etc.
│ │
│ └───routers // Routers for individual components from `components` folder
│ Common.router.ts // API Endpoint handlers for `Common` controller
│ index.ts // All exported routers
│
└───types // TypeScript definition files goes here
types.d.ts // Generic typescript definition file
Debugging
If you need to debug some of your code during development, it's very easy. Open following URL in Chrome: chrome://inspect/#devices
. Click on Open dedicated DevTools for Node
=> DevTools should open. Use Ctrl + P
shortcut to find the file you need, for example Common.controller.ts
. After adding a breakpoint the TypeScript file should be opened directly in devtools.
Note: If inspect mode does not work for you, you need to configure ports by clicking on Configure
button in chrome://inspect/# devices
. The websocket port through which the inspect mode works is displayed during app launch in the command line ("Debugger listening on ws://127.0.0.1:9229/..."). In this example you need to add localhost:9229
in Configure
settings.
API Endpoints params validation
To validate input params sent from API user Joi package is used. At first you need to define validation schemas (example). The next step is to import schemas in your router, instantite Joi validator and use it as middleware. This way you can separate params validation logic out of controllers. Check the example.
Production deployment example
Clone the repo on any unix (cloud) server. Make a build of the app:
yarn run build
Install pm2 process manager:
yarn add -g pm2
Start the app:
pm2 start pm2-process.json
App will be started in daemon mode (background). To check the logs of the app issue following command:
pm2 logs nameOfTheAppFromPm2
You can find the name of the app in pm2-process.json
file.
Copyright (C) 2019 Jozef Butko www.jozefbutko.com