{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-8/",
    "result": {"data":{"markdownRemark":{"html":"<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#defining--creating-the-user-model\">Defining &#x26; creating the User model</a></p>\n<ul>\n<li><a href=\"#schema\">Schema</a></li>\n<li><a href=\"#model\">Model</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#setting-up-a-web-server-using-express\">Setting up a web server using Express</a></p>\n</li>\n<li>\n<p><a href=\"#enabling-server-restart-on-file-change\">Enabling server restart on file change</a></p>\n</li>\n<li>\n<p><a href=\"#setting-up-routes--creating-route-handlers\">Setting up routes &#x26; creating route handlers</a></p>\n</li>\n<li>\n<p><a href=\"#defining-a-custom-error-handler\">Defining a custom error handler</a></p>\n</li>\n<li>\n<p><a href=\"#server-side-form-validation\">Server-side form validation</a></p>\n</li>\n<li>\n<p><a href=\"#using-the-router-module\">Using the Router module</a></p>\n</li>\n</ul>\n</div>\n<h6 id=\"this-blog-post-is-part-of-a-series-you-must-finish-part-1-part-2-part-3-part-4-part-5-part-6--part-7-before-continuing-here\" style=\"position:relative;\"><a href=\"#this-blog-post-is-part-of-a-series-you-must-finish-part-1-part-2-part-3-part-4-part-5-part-6--part-7-before-continuing-here\" aria-label=\"this blog post is part of a series you must finish part 1 part 2 part 3 part 4 part 5 part 6  part 7 before continuing here permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>This blog post is part of a series. You must finish <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-1/\">part-1</a>, <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-2/\">part-2</a>, <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-3/\">part-3</a>, <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-4/\">part-4</a>, <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-5/\">part-5</a>, <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-6/\">part-6</a> &#x26; <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-7/\">part-7</a> before continuing here.</h6>\n<h3 id=\"defining--creating-the-user-model\" style=\"position:relative;\"><a href=\"#defining--creating-the-user-model\" aria-label=\"defining  creating the user model permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Defining &#x26; creating the User model</h3>\n<p>We know that we need to store user details in the database when a user registers in our application. In order to make this happen, we need to define mongoose models to interact with the database.</p>\n<p>We will start by creating a <del>models</del> folder inside the <del>server</del> folder. Then, we will create a file named <del>userModel.js</del> inside the <del>models</del> folder.</p>\n<p>Copy the code below and paste it in the <del>userModel.js</del> file.</p>\n<div class=\"gatsby-code-title\">server/models/userModel.js</div>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"js\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">mongoose</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;mongoose&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">userSchema</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">new</span><span class=\"mtk1\"> </span><span class=\"mtk9\">mongoose</span><span class=\"mtk1\">.</span><span class=\"mtk9\">Schema</span><span class=\"mtk1\">({</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">firstName</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">type</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk9\">String</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">required</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">true</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">lastName</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">type</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk9\">String</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">required</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">true</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">email</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">type</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk9\">String</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">unique</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">true</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"15\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">required</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">true</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"16\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"17\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">password</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"18\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">type</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk9\">String</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"19\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">required</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">true</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"20\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"21\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">})</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"22\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"23\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">User</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">mongoose</span><span class=\"mtk1\">.</span><span class=\"mtk6\">model</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;User&quot;</span><span class=\"mtk1\">, </span><span class=\"mtk3\">userSchema</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"24\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"25\"></span><span class=\"grvsc-source\"><span class=\"mtk9\">module</span><span class=\"mtk1\">.</span><span class=\"mtk9\">exports</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">User</span></span></span></code></pre>\n<p>Above, we have used the <del>Schema</del> constructor to create a new schema instance, defining various fields inside it in the constructor’s object parameter. Note that the fields that we have defined (<del>firstName</del>, <del>lastName</del>, <del>email</del>, <del>password</del>) are the fields that we ask a user to fill in the registration form.</p>\n<p>Then, we have compiled the <del>userSchema</del> into a user model using the <del>mongoose.model()</del> method. Note that the first argument to the model method is the singular name of the collection that will be created for the <del>User</del> model (<em>Mongoose will create the database collection for the <del>User</del> model</em>), and the second argument is the schema that we want to use in creating the <del>User</del> model.</p>\n<p>In the email field, we have set the <del>unique</del> option to true which tells mongoose that a user’s email must be unique.</p>\n<h4 id=\"schema\" style=\"position:relative;\"><a href=\"#schema\" aria-label=\"schema permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Schema</h4>\n<p>The Schema allows you to define the fields stored in each document along with their validation requirements and default values. A schema can have an arbitrary number of fields - each one represents a field in the documents stored in MongoDB.</p>\n<h4 id=\"model\" style=\"position:relative;\"><a href=\"#model\" aria-label=\"model permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Model</h4>\n<p>Once you have created a schema, you can use it to create models. Schemas are compiled into models using the <del>mongoose.model()</del> method. A model maps to a collection of documents in the MongoDB database. The documents will contain the fields that you define in the model Schema.</p>\n<p>In mongoose, a model is a class. The model represents a collection of documents in the database you can search while the model’s instances represent individual documents that you can save and retrieve.</p>\n<h3 id=\"setting-up-a-web-server-using-express\" style=\"position:relative;\"><a href=\"#setting-up-a-web-server-using-express\" aria-label=\"setting up a web server using express permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Setting up a web server using Express</h3>\n<p>Install Express in the <del>mern-auth</del> folder using the following command:</p>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"sh\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-source\"><span class=\"mtk1\">PS C:</span><span class=\"mtk6\">\\U</span><span class=\"mtk1\">sers</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">elhivery</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">esktop</span><span class=\"mtk6\">\\m</span><span class=\"mtk1\">ern-auth</span><span class=\"mtk10\">&gt;</span><span class=\"mtk1\"> npm i express</span></span></span></code></pre>\n<p>Create a file called <del>index.js</del> in the <del>server</del> folder and paste the following code snippet in the file.</p>\n<div class=\"gatsby-code-title\">server/index.js</div>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"js\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">express</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;express&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">dotenv</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;dotenv&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">connectDB</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;./config/db&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">dotenv</span><span class=\"mtk1\">.</span><span class=\"mtk6\">config</span><span class=\"mtk1\">()</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk4 mtki\">// connect to the database</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk6\">connectDB</span><span class=\"mtk1\">()</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">app</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">express</span><span class=\"mtk1\">()</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">app</span><span class=\"mtk1\">.</span><span class=\"mtk6\">use</span><span class=\"mtk1\">(</span><span class=\"mtk3\">express</span><span class=\"mtk1\">.</span><span class=\"mtk6\">json</span><span class=\"mtk1\">())</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">PORT</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">process</span><span class=\"mtk1\">.</span><span class=\"mtk3\">env</span><span class=\"mtk1\">.</span><span class=\"mtk7\">PORT</span><span class=\"mtk1\"> </span><span class=\"mtk10\">||</span><span class=\"mtk1\"> </span><span class=\"mtk7\">5000</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"15\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"16\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">app</span><span class=\"mtk1\">.</span><span class=\"mtk6\">listen</span><span class=\"mtk1\">(</span><span class=\"mtk3\">PORT</span><span class=\"mtk1\">, () </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"17\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk9\">console</span><span class=\"mtk1\">.</span><span class=\"mtk6\">log</span><span class=\"mtk1\">(</span><span class=\"mtk16\">`Server listening on port </span><span class=\"mtk8\">${</span><span class=\"mtk3\">PORT</span><span class=\"mtk8\">}</span><span class=\"mtk16\">`</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"18\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">})</span></span></span></code></pre>\n<p>We require and configure <del>dotenv</del> at the top of the application.</p>\n<p>We use <del>express.json()</del>, which is a built-in middleware function in Express to parse incoming requests with JSON payloads. A new body object containing the parsed data is populated on the request object (i.e. <del>req.body</del>).</p>\n<p>We also need to add the <del>PORT</del> environment variable in the <del>.env</del> file.</p>\n<div class=\"gatsby-code-title\">mern-auth/.env</div>\n<pre class=\"grvsc-container grvsc-has-line-highlighting synthwave-84\" data-language=\"sh\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">PORT=5000</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">MONGO_URI=mongodb+srv://sundaray:</span><span class=\"mtk10\">&lt;</span><span class=\"mtk1\">password</span><span class=\"mtk10\">&gt;</span><span class=\"mtk1\">@sandbox.y8blv.mongodb.net/myFirstDatabase</span><span class=\"mtk10\">?</span><span class=\"mtk1\">retryWrites=true</span><span class=\"mtk10\">&amp;</span><span class=\"mtk1\">w=majority</span></span></span></code></pre>\n<p>Note that whenever you make any changes to the <del>.env</del> file, you will have to stop and restart the server.</p>\n<h3 id=\"enabling-server-restart-on-file-change\" style=\"position:relative;\"><a href=\"#enabling-server-restart-on-file-change\" aria-label=\"enabling server restart on file change permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Enabling server restart on file change</h3>\n<p>Any changes we make to our server-side code will not be visible until we restart the server. It quickly becomes irritating to stop and restart the server every time we make a change. So, we will use a tool for this purpose called <del>nodemon</del> and install it as a development dependency.</p>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"sh\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-source\"><span class=\"mtk1\">PS C:</span><span class=\"mtk6\">\\U</span><span class=\"mtk1\">sers</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">elhivery</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">esktop</span><span class=\"mtk6\">\\m</span><span class=\"mtk1\">ern-auth</span><span class=\"mtk10\">&gt;</span><span class=\"mtk1\"> npm i --save-dev nodemon</span></span></span></code></pre>\n<p>Add the following highlighted code snippet in the <del>package.json</del> file in the <del>mern-auth</del> folder.</p>\n<div class=\"gatsby-code-title\">mern-autj/package.json</div>\n<pre class=\"grvsc-container grvsc-has-line-highlighting synthwave-84\" data-language=\"sh\" data-index=\"5\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">{</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;name&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;mern-auth&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;version&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;1.0.0&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;description&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;main&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;index.js&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;scripts&quot;</span><span class=\"mtk1\">: {</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;server&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;nodemon server/index.js&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;author&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;license&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;ISC&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;dependencies&quot;</span><span class=\"mtk1\">: {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;dotenv&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;^8.2.0&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;express&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;^4.17.1&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;mongoose&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;^5.12.4&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"15\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"16\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;devDependencies&quot;</span><span class=\"mtk1\">: {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"17\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;nodemon&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;^2.0.7&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"18\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  }</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"19\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">}</span></span></span></code></pre>\n<p>Start the Express server using the following command:</p>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"sh\" data-index=\"6\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-source\"><span class=\"mtk1\">PS C:</span><span class=\"mtk6\">\\U</span><span class=\"mtk1\">sers</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">elhivery</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">esktop</span><span class=\"mtk6\">\\m</span><span class=\"mtk1\">ern-auth</span><span class=\"mtk10\">&gt;</span><span class=\"mtk1\"> npm run server</span></span></span></code></pre>\n<p>We will get the following output in the terminal.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 455px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/f319b27644d26365ebdf70ebfd2f0028/c27a4/server.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 51.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABs0lEQVQoz02Q63KjMAyFeYzENwwBY2zL2KbcEieQhm2abaf7/m+zQ7oz22/0S6MjnaMkz3PXNKAN51wrXYnycDgAmLquAYBnWfB+uZ6NAYQJY4w+SdOUMZYIUQFACMF7/9J1w9A557p+GIZ+GIe2bUMIp1Mcp4P3hTHWOVdLiRAilCaccylrIYQxRhsjpaxkVddbB8BqrY0BrZVS0loAAGsbrVRdKyHKJM/zcTrOyxJjnJdlmqbzOR6P0/coAHjvXWMBrHPeORdCALPtqGuZcJ4WZak1FEUhpXhSCSFSnu12m7vdDu33GCGMEX6CMCYYY0JIIiV9f6DHx77rSdcRCyQ/kCwjZUmVYlXFlNpKCJbx9Cfbw5Rin5/k6w85RxpP9P5Gbje6LPR0pNNEvaNGU62oEIxnjFL2k0RKdv8gv7/IeCLLDa9v5HXFy0riBTeONIH3Y9r3qbWMkJTz/2c3cVYdiovPohUvphyb4mSLVue9qY5ORk9slg5F2mQ0xRih/X6PtvT4n1hp835/XOI5xvN6+3Wdr0Pfr6/rPC/LZXaNC77zLrRtC7YZx7Ft26ax35n/AnLPY22ZHJJ6AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Connected to server\"\n        title=\"Connected to server\"\n        src=\"/static/f319b27644d26365ebdf70ebfd2f0028/c27a4/server.png\"\n        srcset=\"/static/f319b27644d26365ebdf70ebfd2f0028/56d15/server.png 200w,\n/static/f319b27644d26365ebdf70ebfd2f0028/d9f49/server.png 400w,\n/static/f319b27644d26365ebdf70ebfd2f0028/c27a4/server.png 455w\"\n        sizes=\"(max-width: 455px) 100vw, 455px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>Our server is successfully listening on port 5000 and our application is connected to the MongoDB database.</p>\n<p>We have one minor issue to fix.</p>\n<p>Currently, we have two servers. We have one server created by <del>create-react-app</del> listening on port 3000. We also have our Express server listening on port 5000. We can start both these servers on separate terminals, but it gets tiring soon. We will use a tool called <del>concurrently</del> which will help us run multiple npm scripts in parallel.</p>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"sh\" data-index=\"7\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-source\"><span class=\"mtk1\">PS C:</span><span class=\"mtk6\">\\U</span><span class=\"mtk1\">sers</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">elhivery</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">esktop</span><span class=\"mtk6\">\\m</span><span class=\"mtk1\">ern-auth</span><span class=\"mtk10\">&gt;</span><span class=\"mtk1\"> npm i concurrently</span></span></span></code></pre>\n<p>Now update the <del>package.json</del> file.</p>\n<div class=\"gatsby-code-title\">mern-auth/server</div>\n<pre class=\"grvsc-container grvsc-has-line-highlighting synthwave-84\" data-language=\"sh\" data-index=\"8\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">{</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;name&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;mern-auth&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;version&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;1.0.0&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;description&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;main&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;index.js&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;scripts&quot;</span><span class=\"mtk1\">: {</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;client&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;npm run start --prefix client&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;server&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;nodemon index.js&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;dev&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;concurrently </span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk16\">npm run client</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk16\"> </span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk16\">npm run server</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk16\">&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;author&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;license&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;ISC&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;dependencies&quot;</span><span class=\"mtk1\">: {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;concurrently&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;^6.0.2&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"15\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;dotenv&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;^8.2.0&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"16\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;express&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;^4.17.1&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"17\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;mongoose&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;^5.12.4&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"18\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"19\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;devDependencies&quot;</span><span class=\"mtk1\">: {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"20\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk16\">&quot;nodemon&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk16\">&quot;^2.0.7&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"21\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  }</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"22\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">}</span></span></span></code></pre>\n<p>Now, we can start the <del>create-react-app</del> server using the command <del>npm run client</del>. We can start the Express server using the command <del>npm run server</del> and we can start both the servers in parallel using <del>npm run dev</del>.</p>\n<h3 id=\"setting-up-routes--creating-route-handlers\" style=\"position:relative;\"><a href=\"#setting-up-routes--creating-route-handlers\" aria-label=\"setting up routes  creating route handlers permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Setting up routes &#x26; creating route handlers</h3>\n<p>Whenever a new user fills in the registration form and clicks on the <del>Register</del> button, we will make a <del>POST</del> request to the <del>/api/users/register</del> endpoint.</p>\n<p>Inside the <del>server</del> folder, create a folder named <del>routes</del>. And inside the <del>routes</del> folder, create a file named <del>userRoutes.js</del>.</p>\n<div class=\"gatsby-code-title\">mern-auth/routes/userRoutes.js</div>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"js\" data-index=\"9\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;/register&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk6\">asyncHandler</span><span class=\"mtk1\">(</span><span class=\"mtk10\">async</span><span class=\"mtk1\"> (</span><span class=\"mtk3 mtki\">req</span><span class=\"mtk1\">, </span><span class=\"mtk3 mtki\">res</span><span class=\"mtk1\">, </span><span class=\"mtk3 mtki\">next</span><span class=\"mtk1\">) </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">firstName</span><span class=\"mtk1\">, </span><span class=\"mtk3\">lastName</span><span class=\"mtk1\">, </span><span class=\"mtk3\">email</span><span class=\"mtk1\">, </span><span class=\"mtk3\">password</span><span class=\"mtk1\"> } </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">req</span><span class=\"mtk1\">.</span><span class=\"mtk7\">body</span><span class=\"mtk1\">;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">userExists</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">await</span><span class=\"mtk1\"> </span><span class=\"mtk3\">User</span><span class=\"mtk1\">.</span><span class=\"mtk6\">findOne</span><span class=\"mtk1\">({ </span><span class=\"mtk3\">email</span><span class=\"mtk1\"> });</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk10\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk3\">userExists</span><span class=\"mtk1\">) {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">err</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">new</span><span class=\"mtk1\"> </span><span class=\"mtk9\">Error</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;User already registered&quot;</span><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">err</span><span class=\"mtk1\">.</span><span class=\"mtk7\">status</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk7\">400</span><span class=\"mtk1\">;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk6\">next</span><span class=\"mtk1\">(</span><span class=\"mtk3\">err</span><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    }</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">user</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">await</span><span class=\"mtk1\"> </span><span class=\"mtk3\">User</span><span class=\"mtk1\">.</span><span class=\"mtk6\">create</span><span class=\"mtk1\">({</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">firstName</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"15\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">lastName</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"16\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">email</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"17\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">password</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"18\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    });</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"19\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"20\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">res</span><span class=\"mtk1\">.</span><span class=\"mtk6\">json</span><span class=\"mtk1\">({ </span><span class=\"mtk3\">message</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;New user created&quot;</span><span class=\"mtk1\"> });</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"21\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  })</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"22\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"23\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"24\"></span><span class=\"grvsc-source\"><span class=\"mtk9\">module</span><span class=\"mtk1\">.</span><span class=\"mtk9\">exports</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">router</span><span class=\"mtk1\">;</span></span></span></code></pre>\n<blockquote>\n<p><strong>Note:</strong> In <del>userRoutes.js</del> file, we have defined route handler callbacks directly inside the router functions. You will often come across blog posts/courses, where the callbacks are defined separately inside a controller module. Either of the approach is fine.</p>\n</blockquote>\n<p>Above, we use an npm package called <del>express-async-handler</del> to handle exceptions inside of async express routes and pass them to express error handlers.</p>\n<p>The logic inside the route handler function is as follows:</p>\n<p>Check whether we already have a user in the database with the provided email address. If yes, send an error message - User already registered - to the client. Otherwise, create a new document in the database and send a message - New user created - to the client.</p>\n<p>Note that when a user exists, we create a custom error and pass it to the <del>next()</del> function. Any error passed to the <del>next()</del> function is handled by the built-in error handler in Express. However, we are going to define a custom error handler.</p>\n<p>At the end of the <del>userRoutes.js</del> file, we export the <del>Router</del> object.</p>\n<h3 id=\"defining-a-custom-error-handler\" style=\"position:relative;\"><a href=\"#defining-a-custom-error-handler\" aria-label=\"defining a custom error handler permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Defining a custom error handler</h3>\n<p>Inside the <del>server</del> folder, create a folder named <del>middleware</del> and inside the <del>middleware</del> folder create a file named <del>errorMiddleware.js</del> and paste the following code snippet in the file.</p>\n<div class=\"gatsby-code-title\">server/middleware/errorMiddleware.js</div>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"js\" data-index=\"10\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk6\">globalErrorHandler</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> (</span><span class=\"mtk3 mtki\">err</span><span class=\"mtk1\">, </span><span class=\"mtk3 mtki\">req</span><span class=\"mtk1\">, </span><span class=\"mtk3 mtki\">res</span><span class=\"mtk1\">, </span><span class=\"mtk3 mtki\">next</span><span class=\"mtk1\">) </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">err</span><span class=\"mtk1\">.</span><span class=\"mtk7\">status</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">err</span><span class=\"mtk1\">.</span><span class=\"mtk7\">status</span><span class=\"mtk1\"> </span><span class=\"mtk10\">||</span><span class=\"mtk1\"> </span><span class=\"mtk7\">500</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">res</span><span class=\"mtk1\">.</span><span class=\"mtk6\">status</span><span class=\"mtk1\">(</span><span class=\"mtk3\">err</span><span class=\"mtk1\">.</span><span class=\"mtk7\">status</span><span class=\"mtk1\">).</span><span class=\"mtk6\">json</span><span class=\"mtk1\">({</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">message</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">err</span><span class=\"mtk1\">.</span><span class=\"mtk7\">message</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">stack</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">process</span><span class=\"mtk1\">.</span><span class=\"mtk3\">env</span><span class=\"mtk1\">.</span><span class=\"mtk7\">NODE_ENV</span><span class=\"mtk1\"> </span><span class=\"mtk10\">===</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;production&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk10\">?</span><span class=\"mtk1\"> </span><span class=\"mtk5\">null</span><span class=\"mtk1\"> </span><span class=\"mtk10\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">err</span><span class=\"mtk1\">.</span><span class=\"mtk7\">stack</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  })</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"><span class=\"mtk9\">module</span><span class=\"mtk1\">.</span><span class=\"mtk9\">exports</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">globalErrorHandler</span></span></span></code></pre>\n<p>There is one issue that we need to fix though. In the <del>userRoutes.js</del> file, you will notice that we are saving the user’s password in the database as plain text. This poses security concerns. Therefore, we must hash the password before we save it to the database. In order to hash the password, we will use a package called <del>bcryptjs</del>.</p>\n<blockquote>\n<p><strong>Hashing</strong>: A secure way to store passwords is to transform them into data that can’t be converted back to original passwords. This one way security mechanism is known as hashing.</p>\n</blockquote>\n<p>One more thing: we will not hash the password inside the route handler function. Instead, we will mongoose <del>pre</del> middleware function, which is specified on the schema level.</p>\n<blockquote>\n<p><strong>Mongoose middleware</strong>: In Mongoose, middlewares let you attach your own custom logic to built-in mongoose functions. Middleware functions are sometimes called hooks. That’s because middlewares let you hook into existing functions.</p>\n</blockquote>\n<p>First, install <del>bcryptjs</del>.</p>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"sh\" data-index=\"11\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-source\"><span class=\"mtk1\">  PS C:</span><span class=\"mtk6\">\\U</span><span class=\"mtk1\">sers</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">elhivery</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">esktop</span><span class=\"mtk6\">\\m</span><span class=\"mtk1\">ern-auth</span><span class=\"mtk10\">&gt;</span><span class=\"mtk1\"> npm i bcryptjs</span></span></span></code></pre>\n<p>Add the highlighted code snippets below in <del>userModel.js</del>.</p>\n<div class=\"gatsby-code-title\">server/models/userModel.js</div>\n<pre class=\"grvsc-container grvsc-has-line-highlighting synthwave-84\" data-language=\"js\" data-index=\"12\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">mongoose</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;mongoose&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">bcrypt</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;bcryptjs&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">userSchema</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">new</span><span class=\"mtk1\"> </span><span class=\"mtk9\">mongoose</span><span class=\"mtk1\">.</span><span class=\"mtk9\">Schema</span><span class=\"mtk1\">({</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">firstName</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">type</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk9\">String</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">required</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">true</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">lastName</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">type</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk9\">String</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">required</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">true</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">email</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">type</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk9\">String</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"15\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">unique</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">true</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"16\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">required</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">true</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"17\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"18\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">password</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"19\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">type</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk9\">String</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"20\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">required</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">true</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"21\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"22\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">})</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"23\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"24\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">userSchema</span><span class=\"mtk1\">.</span><span class=\"mtk6\">pre</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;save&quot;</span><span class=\"mtk1\">, </span><span class=\"mtk10\">async</span><span class=\"mtk1\"> </span><span class=\"mtk10\">function</span><span class=\"mtk1\"> () {</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"25\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">salt</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">await</span><span class=\"mtk1\"> </span><span class=\"mtk3\">bcrypt</span><span class=\"mtk1\">.</span><span class=\"mtk6\">genSalt</span><span class=\"mtk1\">(</span><span class=\"mtk7\">10</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"26\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk9 mtkb\">this</span><span class=\"mtk1\">.</span><span class=\"mtk7\">password</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">await</span><span class=\"mtk1\"> </span><span class=\"mtk3\">bcrypt</span><span class=\"mtk1\">.</span><span class=\"mtk6\">hash</span><span class=\"mtk1\">(</span><span class=\"mtk9 mtkb\">this</span><span class=\"mtk1\">.</span><span class=\"mtk7\">password</span><span class=\"mtk1\">, </span><span class=\"mtk3\">salt</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"27\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">})</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"28\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"29\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">User</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">mongoose</span><span class=\"mtk1\">.</span><span class=\"mtk6\">model</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;User&quot;</span><span class=\"mtk1\">, </span><span class=\"mtk3\">userSchema</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"30\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"31\"></span><span class=\"grvsc-source\"><span class=\"mtk9\">module</span><span class=\"mtk1\">.</span><span class=\"mtk9\">exports</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">User</span></span></span></code></pre>\n<p>Mongoose will call the <del>pre(‘save’)</del> function before sending the fields to the database. Hold on a sec. Where are we using the <del>save()</del> function? Notice that in the route handler function responsible for handling the <del>/api/users/register</del> endpoint, we are using the <del>create</del> function of the <del>User</del> model to create a new user. The <del>create()</del> function is actually a thin wrapper around the <del>save()</del> function.</p>\n<p>The <del>genSalt()</del> method takes in a number known as salt rounds (aka cost), which is a measure of the no. of steps involved in creating the hash. The second argument to the <del>hash()</del> method is salt, which is a random string combined with the password to generate the hashed password.</p>\n<h3 id=\"server-side-form-validation\" style=\"position:relative;\"><a href=\"#server-side-form-validation\" aria-label=\"server side form validation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Server-side form validation</h3>\n<p>We have already discussed the point that we should never trust the data coming from the client. It is possible for a malicious user to by-pass client-side validation and send bad data to the server. So, it’s important that we do server side validation of the form data as a security best-practice.</p>\n<p>We will use a package called <del>joi</del>, which is a schema description language and data validator for JavaScript.</p>\n<p>Install <del>joi</del>.</p>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"sh\" data-index=\"13\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-source\"><span class=\"mtk1\">PS C:</span><span class=\"mtk6\">\\U</span><span class=\"mtk1\">sers</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">elhivery</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">esktop</span><span class=\"mtk6\">\\m</span><span class=\"mtk1\">ern-auth</span><span class=\"mtk10\">&gt;</span><span class=\"mtk1\"> npm i joi</span></span></span></code></pre>\n<p>Inside the <del>server</del> folder, create a folder named <del>validation</del> and inside the <del>validation</del> folder create a file named <del>validate.js</del>.</p>\n<p>Inside the <del>validate.js</del> file, paste the following code snippet.</p>\n<div class=\"gatsby-code-title\">server/validation/validate.js</div>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"js\" data-index=\"14\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Joi</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;joi&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk6\">registrationValidation</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3 mtki\">formData</span><span class=\"mtk1\"> </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">schema</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Joi</span><span class=\"mtk1\">.</span><span class=\"mtk6\">object</span><span class=\"mtk1\">({</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">firstName</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Joi</span><span class=\"mtk1\">.</span><span class=\"mtk6\">string</span><span class=\"mtk1\">().</span><span class=\"mtk6\">required</span><span class=\"mtk1\">().</span><span class=\"mtk6\">max</span><span class=\"mtk1\">(</span><span class=\"mtk7\">20</span><span class=\"mtk1\">),</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">lastName</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Joi</span><span class=\"mtk1\">.</span><span class=\"mtk6\">string</span><span class=\"mtk1\">().</span><span class=\"mtk6\">required</span><span class=\"mtk1\">().</span><span class=\"mtk6\">max</span><span class=\"mtk1\">(</span><span class=\"mtk7\">20</span><span class=\"mtk1\">),</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">email</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Joi</span><span class=\"mtk1\">.</span><span class=\"mtk6\">string</span><span class=\"mtk1\">().</span><span class=\"mtk6\">required</span><span class=\"mtk1\">().</span><span class=\"mtk6\">email</span><span class=\"mtk1\">(),</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">password</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Joi</span><span class=\"mtk1\">.</span><span class=\"mtk6\">string</span><span class=\"mtk1\">().</span><span class=\"mtk6\">required</span><span class=\"mtk1\">().</span><span class=\"mtk6\">min</span><span class=\"mtk1\">(</span><span class=\"mtk7\">5</span><span class=\"mtk1\">),</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  })</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk10\">return</span><span class=\"mtk1\"> </span><span class=\"mtk3\">schema</span><span class=\"mtk1\">.</span><span class=\"mtk6\">validate</span><span class=\"mtk1\">(</span><span class=\"mtk3\">formData</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk9\">module</span><span class=\"mtk1\">.</span><span class=\"mtk9\">exports</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">registrationValidation</span><span class=\"mtk1\"> }</span></span></span></code></pre>\n<p>Now, add the highlighted code snippets in <del>userRoutes.js</del> file.</p>\n<div class=\"gatsby-code-title\">server/routes/userRoutes.js</div>\n<pre class=\"grvsc-container grvsc-has-line-highlighting synthwave-84\" data-language=\"js\" data-index=\"15\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">onst</span><span class=\"mtk1\"> </span><span class=\"mtk3\">express</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;express&quot;</span><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">asyncHandler</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;express-async-handler&quot;</span><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">User</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;../models/userModel&quot;</span><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">registrationValidation</span><span class=\"mtk1\"> } </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;../validation/validate&quot;</span><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">router</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">express</span><span class=\"mtk1\">.</span><span class=\"mtk6\">Router</span><span class=\"mtk1\">();</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">router</span><span class=\"mtk1\">.</span><span class=\"mtk6\">post</span><span class=\"mtk1\">(</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;/register&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk6\">asyncHandler</span><span class=\"mtk1\">(</span><span class=\"mtk10\">async</span><span class=\"mtk1\"> (</span><span class=\"mtk3 mtki\">req</span><span class=\"mtk1\">, </span><span class=\"mtk3 mtki\">res</span><span class=\"mtk1\">, </span><span class=\"mtk3 mtki\">next</span><span class=\"mtk1\">) </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">error</span><span class=\"mtk1\"> } </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">registrationValidation</span><span class=\"mtk1\">(</span><span class=\"mtk3\">req</span><span class=\"mtk1\">.</span><span class=\"mtk7\">body</span><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk10\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk3\">error</span><span class=\"mtk1\">) {</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">err</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">new</span><span class=\"mtk1\"> </span><span class=\"mtk9\">Error</span><span class=\"mtk1\">(</span><span class=\"mtk3\">error</span><span class=\"mtk1\">.</span><span class=\"mtk7\">details</span><span class=\"mtk1\">[</span><span class=\"mtk7\">0</span><span class=\"mtk1\">].</span><span class=\"mtk7\">message</span><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"15\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">err</span><span class=\"mtk1\">.</span><span class=\"mtk7\">status</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk7\">400</span><span class=\"mtk1\">;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"16\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk6\">next</span><span class=\"mtk1\">(</span><span class=\"mtk3\">err</span><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"17\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    }</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"18\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"19\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">firstName</span><span class=\"mtk1\">, </span><span class=\"mtk3\">lastName</span><span class=\"mtk1\">, </span><span class=\"mtk3\">email</span><span class=\"mtk1\">, </span><span class=\"mtk3\">password</span><span class=\"mtk1\"> } </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">req</span><span class=\"mtk1\">.</span><span class=\"mtk7\">body</span><span class=\"mtk1\">;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"20\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"21\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">userExists</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">await</span><span class=\"mtk1\"> </span><span class=\"mtk3\">User</span><span class=\"mtk1\">.</span><span class=\"mtk6\">findOne</span><span class=\"mtk1\">({ </span><span class=\"mtk3\">email</span><span class=\"mtk1\"> });</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"22\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"23\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk10\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk3\">userExists</span><span class=\"mtk1\">) {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"24\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">err</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">new</span><span class=\"mtk1\"> </span><span class=\"mtk9\">Error</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;User already registered&quot;</span><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"25\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">err</span><span class=\"mtk1\">.</span><span class=\"mtk7\">status</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk7\">400</span><span class=\"mtk1\">;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"26\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk6\">next</span><span class=\"mtk1\">(</span><span class=\"mtk3\">err</span><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"27\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    }</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"28\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"29\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">user</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">await</span><span class=\"mtk1\"> </span><span class=\"mtk3\">User</span><span class=\"mtk1\">.</span><span class=\"mtk6\">create</span><span class=\"mtk1\">({</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"30\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">firstName</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"31\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">lastName</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"32\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">email</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"33\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">password</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"34\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    });</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"35\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"36\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">res</span><span class=\"mtk1\">.</span><span class=\"mtk6\">json</span><span class=\"mtk1\">({ </span><span class=\"mtk3\">message</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;New user created&quot;</span><span class=\"mtk1\"> });</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"37\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  })</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"38\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">);</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"39\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"40\"></span><span class=\"grvsc-source\"><span class=\"mtk9\">module</span><span class=\"mtk1\">.</span><span class=\"mtk9\">exports</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">router</span><span class=\"mtk1\">;</span></span></span></code></pre>\n<h3 id=\"using-the-router-module\" style=\"position:relative;\"><a href=\"#using-the-router-module\" aria-label=\"using the router module permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Using the Router module</h3>\n<p>To use the <del>Router</del> module, we require the <del>userRoutes.js</del> module in <del>index.js</del> and then call <del>use()</del> on the Express application (<del>app</del>) to add the router in the middleware handling chain.</p>\n<p>We also require the <del>errorHandler.js</del> module and define it after all the <del>app.use()</del> calls, because an error handler must be the last middleware in the request processing pipeline.</p>\n<div class=\"gatsby-code-title\">server/index.js</div>\n<pre class=\"grvsc-container grvsc-has-line-highlighting synthwave-84\" data-language=\"js\" data-index=\"16\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">express</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;express&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">dotenv</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;dotenv&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">globalErrorHandler</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;./middleware/errorMiddleware&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">userRoutes</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;./routes/userRoutes&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">connectDB</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">require</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;./config/db&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">dotenv</span><span class=\"mtk1\">.</span><span class=\"mtk6\">config</span><span class=\"mtk1\">()</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"><span class=\"mtk6\">connectDB</span><span class=\"mtk1\">()</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">app</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">express</span><span class=\"mtk1\">()</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">app</span><span class=\"mtk1\">.</span><span class=\"mtk6\">use</span><span class=\"mtk1\">(</span><span class=\"mtk3\">express</span><span class=\"mtk1\">.</span><span class=\"mtk6\">json</span><span class=\"mtk1\">())</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"15\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"16\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">app</span><span class=\"mtk1\">.</span><span class=\"mtk6\">use</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;/api/users&quot;</span><span class=\"mtk1\">, </span><span class=\"mtk3\">userRoutes</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"17\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"18\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">app</span><span class=\"mtk1\">.</span><span class=\"mtk6\">use</span><span class=\"mtk1\">(</span><span class=\"mtk3\">globalErrorHandler</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"19\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"20\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">PORT</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">process</span><span class=\"mtk1\">.</span><span class=\"mtk3\">env</span><span class=\"mtk1\">.</span><span class=\"mtk7\">PORT</span><span class=\"mtk1\"> </span><span class=\"mtk10\">||</span><span class=\"mtk1\"> </span><span class=\"mtk7\">5000</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"21\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"22\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">app</span><span class=\"mtk1\">.</span><span class=\"mtk6\">listen</span><span class=\"mtk1\">(</span><span class=\"mtk3\">PORT</span><span class=\"mtk1\">, () </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"23\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk9\">console</span><span class=\"mtk1\">.</span><span class=\"mtk6\">log</span><span class=\"mtk1\">(</span><span class=\"mtk16\">`Server listening on port </span><span class=\"mtk8\">${</span><span class=\"mtk3\">PORT</span><span class=\"mtk8\">}</span><span class=\"mtk16\">`</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"24\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">})</span></span></span></code></pre>\n<p>Go to <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-9/\">part-9</a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    position: relative;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n    line-height: 1.4;\n  }\n  \n  .grvsc-code {\n    display: table;\n  }\n  \n  .grvsc-line {\n    display: table-row;\n    box-sizing: border-box;\n    width: 100%;\n    position: relative;\n  }\n  \n  .grvsc-line > * {\n    position: relative;\n  }\n  \n  .grvsc-gutter-pad {\n    display: table-cell;\n    padding-left: 0.75rem;\n    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);\n  }\n  \n  .grvsc-gutter {\n    display: table-cell;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    user-select: none;\n  }\n  \n  .grvsc-gutter::before {\n    content: attr(data-content);\n  }\n  \n  .grvsc-source {\n    display: table-cell;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-source:empty::after {\n    content: ' ';\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    user-select: none;\n  }\n  \n  .grvsc-gutter + .grvsc-source {\n    padding-left: 0.75rem;\n    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);\n  }\n  \n  /* Line transformer styles */\n  \n  .grvsc-has-line-highlighting > .grvsc-code > .grvsc-line::before {\n    content: ' ';\n    position: absolute;\n    width: 100%;\n  }\n  \n  .grvsc-line-diff-add::before {\n    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));\n  }\n  \n  .grvsc-line-diff-del::before {\n    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));\n  }\n  \n  .grvsc-line-number {\n    padding: 0 2px;\n    text-align: right;\n    opacity: 0.7;\n  }\n  \n  .synthwave-84 { background-color: #262335; }\n  .synthwave-84 .mtkb { font-weight: bold; }\n  .synthwave-84 .mtki { font-style: italic; }\n  .synthwave-84 .mtk10 { color: #FEDE5D; }\n  .synthwave-84 .mtk1 { color: #FFFFFF; }\n  .synthwave-84 .mtk3 { color: #FF7EDB; }\n  .synthwave-84 .mtk12 { color: #FFFFFFEE; }\n  .synthwave-84 .mtk6 { color: #36F9F6; }\n  .synthwave-84 .mtk16 { color: #FF8B39; }\n  .synthwave-84 .mtk9 { color: #FE4450; }\n  .synthwave-84 .mtk14 { color: #B6B1B1; }\n  .synthwave-84 .mtk5 { color: #F97E72; }\n  .synthwave-84 .mtk4 { color: #848BBD; }\n  .synthwave-84 .mtk7 { color: #2EE2FA; }\n  .synthwave-84 .mtk8 { color: #72F1B8; }\n  .synthwave-84 .grvsc-line-highlighted::before {\n    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));\n  }\n</style>","frontmatter":{"title":"Implement JWT Based User Authentication in a MERN Stack App - Part 8","date":"2021-05-23"}}},"pageContext":{"slug":"/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-8/","prev":{"fields":{"slug":"/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-7/"},"frontmatter":{"modules":null}},"next":{"fields":{"slug":"/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-9/"},"frontmatter":{"modules":null}}}},
    "staticQueryHashes": ["3159585216"]}