Heroku

I decide to post the Mongo Explorer API project to Heroku.

Here is what had to do:

  1. Create an account on Heroku
  2. Installed Heroku Command Line Interface (CLI) with homebrew:
     brew install Heroku
  3. Logger on to Heroku:
     heroku login
  4. Created an app:
    heroku create
  5. Deploy the code:
    git push heroku master
  6. Obviously, the app crashed and did not run, so I had to check the logs:
    heroku logs --tail

It took me couple hours to figure out how to prepare my project to run on Heroku:

  1. I had to add start script in package.json. Heroku uses Procfile, but if file is not found then it looks for start script:
    “scripts”: {
    “start”: “node app.js”
    }
  2. Heroku assigns port dynamically, so I had to change startup code from: app.listen(config.get(‘NODE_PORT’));
    to
    var port = process.env.PORT || config.get('NODE_PORT');
    app.listen(port);
  3. Now the app started, but Swagger UI was failing so I had do the last change: in swaggerDefinition variable I had to change
    host from localhost:4000 to dry-spire-23794.herokuapp.com
  4. The last thing was adding CORS support.

And now my app runs on:

https://dry-spire-23794.herokuapp.com/

 

Advertisements

Swagger

Time to add some UI.

Fortunately, I know pretty easy and cool way to visualize API – my old friend Swagger. I used Swagger in one of my projects in ASP.NET and decided to use it for my Node.JS project. I found pretty good article on adding Swagger support:

http://mherman.org/blog/2016/05/26/swagger-and-nodejs/#.WPJ-y1Pytn5

Just committed first basic Swagger description in my project: https://github.com/alishdev/mongo-explorer-api which will be accessible from http://localhost:4000/api-docs/

Passing connection information

Since the goal of the API to connect to any database and explore it the API project cannot store connection information in config file. Instead connection info must be passed with every request.

Initially I was thinking to pass info in the body of the request, but since I have to implement GET requests also (which according to REST is not supposed to have bodies) I had two options:

  1. put connection info into request parameters (not safe)
  2. put connection info into request header

The latter solution seems to be the correct and simplest one: I used middleware in Express.js to read header and populate request’s connectionString parameter.

API Design

I found couple helpful links for anyone who wants to build API project:

http://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/

https://scotch.io/tutorials/keeping-api-routing-clean-using-express-routers

So at this point the API structure I think will be following:

db – get list of all databases
db/:dbname – get, put, post, delete db named as :dbname

db/:dbname/collection – get list of all collections in db named as :dbname
db/:dbname/collection/:colname – get, put, post, delete collection named :colname in db named as :dbname

db/:dbname/collection:colname/doc – get list of all documents in collection named :colname in db named as :dbname
db/:dbname/collection/:colname/doc/:docid – get, put, post, delete document with id :docid in  collection named :colname in db named as :dbname

Mongo Explorer API

There was some break since I have written anything, but I was not abandoning the project. Instead I took a class provided by MongoDB University:

https://university.mongodb.com/courses/M101N/about

I also read a book on Node.js:

 

When reading this book I felt at home first time I started learning web development – probably because I am really a back end developer.

After some consideration I came to conclusion that I need to start with API project first, so I added a new project on Github:

https://github.com/alishdev/mongo-explorer-api