In last blog, we understood about connecting MongoDB with our Node.js app. In this blog, we are going to expose our DB CRUD operation as REST APIs.
Please go through previous blog where we talk about having connection with MongoDB.
Before diving-in, let’s first talk about some common terminology:
REST API:
It is a web standard based architecture and depends on HTTP protocol. There are 5 most common used methods in REST API. These are:
GET : Used for fetching data from source/database
POST : Used to create data in source/database
PUT: Used for updating/modifying the resources into the database
PATCH: Mostly its behave as same as PUT though its implementation totally depends upon kind of work one wants to perform
DELETE : Used for deleting data from database/source
In this tutorial, we are going to use some industrial good practices to create our app. We are going to use MV* architecture. If you don’t know what is MV* then you can read it from here.
So, before setting up our application we need to talk about our approach. We will use server.js as our application entry-point.
I’ve created one info-graphic for understanding our project structure. Though, it is self-explanatory but we will explain while we are creating our app as well.
High-Level Architecture
So, now let’s start creating our application. Create folder REST_API and execute below command at root structure:
npm init
Note: make sure while creating the package.json file, you name your index file as server.js instead of default index.js
After creation of project folder, execute below command to install expres.js, mongoose, and other tools like babelbabel-cliwebpack which are required for our application:
body-parser is used to parse all requests coming to application and babel is used for backward compatibility and webpack for production bundling.
So, From our high-level diagram, we will start from bottom to top. Let’s start creating our Model Schema for user. Create models folder in root directory, inside it create user.js and paste below code:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
In above code, we are creating our user schema to hold up user information. In our schema, we are having only 2 required field for demo purpose. I suggest to read previous blog, where we talk about connecting MongoDB database with Node.js IFF you are still having understanding above code.
Once, we are done with our Schema model then we can move one step above in our diagram and we can create our Services structure.
Let’s create folder services in root directory. After that, create users folder inside it and create userServices.js inside users folder. In our userServices, we will write our core business logic for our APIs.
We will write logic for below functions:
getUsers : Function to fetch all users from our MongoDB
getUserById: Function to fetch single user information based on provided id from DB
createUser : Function to create user in DB
updateUser: Function to update user information into DB based on id
deleteUser : Function to delete user based on id
In our code, we have used await and async features of es-next. These features provides us the power to perform operations asynchronously.
Paste below code in userServices.js. Right now, we will only code for createUser and getUsers api logic. Once done with these, we can mold others.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Understanding above code is easy as we have written similar kind of code in previous blog while working with MongoDB connection with Node.js app.
Now, we can move on for creating controller section. This will help us to control the redirection/routing of request depending upon HTTP methods (GET, POST etc).
Create controllers folder in root directory of project and create apis folder inside it. Inside this, create userController.js file which will hold our controlling logic.
In userController.js, we are creating object of router() function from express.js framework. Using router we can redirect HTTP methods to their desired function in userServices.js. For understanding more on router function, please visit this. Paste below code in your userController.js file:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Let’s move to one more block up. There we will find that we are having routes logic folder. Here, we will hold our API versioning and logging.
So, first create a folder routes in root structure and create a folder apis inside it. Inside this, we will create mainApi.js and v1.js files.
v1.js will hold version 1 of our API. In this again we are creating route object and calling controller object with help of route object. Below is the code of v1.js file:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Next is mainApi.js file. This will help us to handle versioning and we can redirect request to different versions based on logic. In this file, we are going to call v1.js with help of router object. Below is the code of mainApi.js:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Now, we can move to routes folder. Create routes.js inside routes folder. This file will act as a logger and upper layer router. Below is the code of this file:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
So, most of our 90% app is complete. We are just left with few stuffs. Let’s do them quickly and try to run our app.
Let’s create configs folder in root structure. Inside it, create config folder. Inside config folder, create 2 files config.js and local.js. these files will help us to hold environment configurations. Below is code for local.js to hold port information where our app will run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
In config.js, we will hold local configuration as well as environment configurations. Though, if you want you can merge these 2 files and work with one file only.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Now, inside configs folder, create 2 files app.js and db.js.
db.js contains MongoDB information. Just paste below code:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
app.js contain code related to server configuration. In this, we will write start and create function. create will configure all setup of our application and start will start our application. Paste below code:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Yayyy!!!!, we are done. Now, we just need to code our Entry pointserver.js. Just paste below code:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
And we are done. We have completed our application. Just run the app using nodemon server.js and open Advance Rest Client or any other Rest client.
Note: While creating our app, we encounter that we are creating router object with use method handlers. These handlers are API urls.
So, open your rest client and hit below api
Creating User
POST http://localhost:3000/api/v1/users
You should get below output:
Get users
GET http://localhost:3000/api/v1/users
You should get something like below:
In same way, one can create other functions like getUserById, updateUser and deleteUser. You should try creating these by yourself. If you still want to get full project code, I’ve uploaded in on my GitHub. You can fork or clone it from here.
In next series, we will learn how to make this API secure.