New
{New}  MongoDB Atlas Vector Search integration with Amazon Bedrock - Learn more

How to Use MERN Stack: A Complete Guide

You will need access to the MongoDB Atlas database for this tutorial. If you don't have an account you can sign up free to follow along.
Get Started Free

This tutorial will show you how to build a full-stack MERN application—in this case, an employee database—with the most current tools available. Before you begin, make sure that you are familiar with Node.js and React.js basics and have Node and Create React App installed. You will also need access to the MongoDB Atlas database for this tutorial. The full code is available on this GitHub repo.

Table Of Contents
What is the MERN Stack?

The MERN stack is a web development framework made up of the stack of MongoDB, Express.js, React.js, and Nodejs. It is one of the several variants of the MEAN stack.

When you use the MERN stack, you work with React to implement the presentation layer, Express and Node to make up the middle or application layer, and MongoDB to create the database layer.

In this MERN stack tutorial, we will utilize these four technologies to develop a basic application that is able to record the information of employees and then display it using a React.

How to Get Started with the MERN Stack

To get started, you will need to do the following:

  1. Install Node
    To install Node, go to https://nodejs.org/en/ and download either the LTS version or the current version.

  2. Have or Install a Code Editor
    You can use any code editor of your choice for this tutorial. However, for the sake of demonstration, we will be using VS Code editor with the plugin prettier and vscode icons.

Setting Up the Project

(Feel free to code along or to download the full code from this GitHub repo.)

MERN lets us create full-stack solutions. So, to leverage its full potential, we will be creating a MERN stack project. For this project, we will create both a back end and a front end. The front end will be implemented with React and the back end will be implemented with MongoDB, Node, and Express. We will call the front end client and the back end server.

Let’s start by creating an empty directory: mern. This folder will hold all our files after we create a new project. Then we will create a React app—client—in it.

Then, we create a folder for the back end and name it server.

We will jump into the server folder that we created previously and create the server. Then, we will initialize package.json using npm init.

We will also install the dependencies.

The command above uses a couple of keywords:

  • mongodb command installs MongoDB database driver that allows your Node.js applications to connect to the database and work with data.
  • express installs the web framework for Node.js. (It will make our life easier.)
  • cors installs a Node.js package that allows cross origin resource sharing.
  • dotenv installs the module that loads environment variables from a .env file into process.env file. This lets you separate configuration files from the code.

We can check out installed dependencies using the package.json file. It should list the packages along with their versions.

After we have ensured that dependencies were installed successfully, we create a file called server.js with the following code.:

mern/server/server.js

Here, we are requiring express and cors to be used. const port process.env.port will access the port variable from the config.env we required.

Connecting to MongoDB Atlas

It’s time to connect our server to the database. We will use MongoDB Atlas as the database. MongoDB Atlas is a cloud-based database service that provides robust data security and reliability. MongoDB Atlas provides a free tier cluster that never expires and lets you access a subset of Atlas features and functionality.

Follow the Get Started with Atlas guide to create an account, deploy your first cluster, and locate your cluster’s connection string.

Now that you have the connection string, go back to the ‘server’ directory and create a ‘config.env’ file. There, assign the connection string to a new ATLAS_URI variable. Once done, your file should look similar to the one below. Replace < username > and the < password > with your database username and password.

mern/server/config.env

Create a folder under the server directory—db—and inside it, a file—conn.js. There we can add the following code to connect to our database.

mern/server/db/conn.js

Server API Endpoints

Database done. Server done. Now it's time for the Server API endpoint. Let's start by creating a routes folder and adding record.js in it. Navigate back to your “server” directory and create the new directory and file:

The routes/record.js file will also have the following lines of code in it.

mern/server/routes/record.js

If you run the application at this point, you will get the following message in your terminal as the connection establishes.

That’s it for the back end. Now, we will start working on the front end.

Setting Up the React Application

As we have already set up our React application using the create-react-app command, we can navigate to the client folder and check our React application code.

Let’s flesh out the application, but before we do, we need to install two additional dependencies that will be used in our project. Open a new terminal emulator, navigate to the “client” directory, and install bootstrap and react-router-dom.

bootstrap lets you quickly deploy a template and components for your new web application without having to do everything from scratch. And, the react-router-dom installs React router components for web applications. Make sure your server application is still running!

Setting Up the React Router

Let's start by emptying the src folder and adding two new files in it: index.js and App.js.

Inside src/index.js, we add the following code:

mern/client/src/index.js

We have used BrowserRouter to keep our UI in sync with the URL. BrowserRouter helps with seamless transitions while switching between components. Basically, it will only reload/refresh the component that needs to be changed instead of refreshing/reloading the entire page. Though BrowserRouter is not a necessity, it is a must if you want your app to be responsive.

Creating Components

After adding the code to index.js files, we will create a components folder inside src. For each component we create, we will add a new .js file inside the components folder. In this case, we will add create.js, edit.js, navbar.js, and recordList.js.

A snapshot of each file would look like the following.

create.js

The following code will serve as a creating component for our records. Using this component, users can create a new record. This component will submit a create command to our server.

mern/client/src/components/create.js

edit.js

The following code will serve as an editing component for our records. It will use a similar layout to the create component and will eventually submit an update command to our server.

mern/client/src/components/edit.js

recordList.js

The following code will serve as a viewing component for our records. It will fetch all the records in our database through a GET method.

mern/client/src/components/recordList.js

In the navbar.js component, we will create a navigation bar that will link us to the required components using the following code.

mern/client/src/components/navbar.js

Now, we add the following to the src/App.js file we created earlier.

mern/client/src/App.js

Connecting the Front End to the Back End

We have completed creating components. We also connected our React app to the back end using fetch. fetch provides cleaner and easier ways to handle http requests. fetch is used in create.js, edit.js, and recordList.js as they handle http requests. In create.js, we appended the following code to the onSubmit(e) block. When a POST request is sent to the create URL, fetch will add a new record to the database.

Similarly, in edit.js, we appended the following code to the onSubmit(e) block.

We also placed the following block of code to edit.js beneath the constructor block.

Lastly, we have recordList.js. recordList.js fetches the records from the database, so we will be using fetch's get method to retrieve records from the database. To achieve this, we added the following lines of code above the recordList() function in recordList.js.

After closing everything, to start the app, follow these steps.

  • Ensure that the server app is still running. If it’s not, start by executing the following command in the server/ directory:
  • Go back to the client directory and run the command:

This is what the landing page of the record component will look like after we added two records for “Richard” and “Billy” via the “Create Record” button.

This is what the screen that lets you add an employee will look like.
Congratulations on building your first MERN application. For more ideas and advanced concepts, visit our Developer Hub or follow this MERN workshop to take a basic MERN To-Do app through to a fully managed, auto-scaling application.

Get started free
Learn more