Bulletproof Node.js architecture with TypeORM (PostgreSQL) 🛡️

This is a template fork repo of Bulletproof NodeJS repo here which I customised according to my needs.

  • Made AgendaJS optional since Job scheduling is not a usual thing in the initial requirements.
  • Added TypeORM and totally removed Mongoose.

Development

We use node version 10.15.0

nvm install 10.15.0
nvm use 10.15.0

The first time, you will need to run

npm install

Then just start the server with

npm run start

It uses nodemon for livereloading :peace-fingers:

API Validation

By using celebrate the req.body schema becomes clary defined at route level, so even frontend devs can read what an API endpoint expects without need to writting a documentation that can get outdated quickly.

route.post('/signup',
 celebrate({
   body: Joi.object({
     name: Joi.string().required(),
     email: Joi.string().required(),
     password: Joi.string().required(),
   }),
 }),
 controller.signup)

Example error

{
 "errors": {
   "message": "child \"email\" fails because [\"email\" is required]"
 }
}

Read more about celebrate here and the Joi validation API

Roadmap

  • API Validation layer (Celebrate+Joi)
  • Unit tests examples
  • Cluster mode
  • The logging 'layer'
  • Add agenda dashboard
  • Continuous integration with CircleCI 😍
  • Deploys script and docs for AWS Elastic Beanstalk and Heroku
  • Integration test with newman 😉
  • Instructions on typescript debugging with VSCode

FAQ

Where should I put the FrontEnd code? Is this a good backend for Angular or React or Vue or whatever ?

It's not a good idea to have node.js serving static assets a.k.a the frontend

Also, I don't wanna take part in frontend frameworks wars 😅

Just use the frontend framework you like the most or hate the least. It will work 😁

Don't you think you can add X layer to do Y? Why do you still use express if the Serverless Framework is better and it's more reliable?

I know this is not a perfect architecture but it's the most scalable that I know with less code and headache that I know.

It's meant for small startups or one-developer army projects.

I know if you start moving layers into another technology, you will end up with your business/domain logic into npm packages, your routing layer will be pure AWS Lambda functions and your data layer a combination of DynamoDB, Redis, maybe redshift, and Agolia.

Take a deep breath and go slowly, let the business grow and then scale up your product. You will need a team and talented developers anyway.

Credits

Again, all work credit in this repo goes to the Author Sam Quinn as I've just customised it for personal use.