{"componentChunkName":"component---src-templates-blog-post-js","path":"/intro-to-nodejs-part-2/","result":{"data":{"site":{"siteMetadata":{"title":"tech-blog","author":"Alamgir Qazi"}},"markdownRemark":{"id":"f956a9b7-9616-5c2c-92ba-9a23b453640f","excerpt":"This is the part 2 of post Intro to Nodejs - part 1. In this, we will continue from the express application we created and build a very…","html":"<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/a717eafa290bf333c4dd1c86076c5b9e/d9199/node-js.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACKElEQVQoz32Sz2vTYBjHnzfVHedglzpRUUSTTE3UJq9jS9I0s/h7BwXdZbUyRUS9+A8sWZqijrGDN0+iB0U8CP4Nw7Vqi9OLStllIHrx5kWI3ydpvWngy/O27/N+np9E//m8sk2ua5ED4ayUfUkD/fMbOAQnJdXCI7SwqlPc0ShqaVSdscgtWzTllDL4wNevSJo+ZVM9MSlc06nR1WjhjUpLX8YzoJJFr0hlfvkwLb7TlLClKotvNcU+OAFQBhmBbkIFSMC/gP+VNCWK32uCgZBY+poD8+iIeqVhEEAUtlWKYE9fKgm+v3/3Hvt9h1+RA0wck2iFpEe/D1Ccw4YYCqDCjgH02g9kpZ4YFLU1B1k+gfXrTYP8aWnxPQPLFXsYQMuZlC9hq5UTNleko0UeNI6StzHwF/TM8+S3WmgW4476A9mlsD+vrxhjyKSH7B+XfXsT572AbpyfK7XxZvXGQ2M0WVdnUPZVAO8kH/RhBm6cnbW3Ati9eOvorrir9vrAzWvLZtFz5Wf4vIB6AI71gc+Dqtz+Kt29BRkybB66DeAIA/fjESH9fUQXlOYnVYXTA0zZqDdMLtmEz1NIIigP6RBKXoHdeWbWomhN34H+TUJ7eDvyoQCIhzREASUfeSAq95JqkSnQ278r47q24KFMHcfZyVcoauk86Ww4zfUcKPgSD8Uo+QwUUVstoGwxF5m8c9ma9Ncr80c/+TdVz9kMFBmwo4k0vUx/ANst4OwYAzGqAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"Intro To Node.js\"\n        title=\"\"\n        src=\"/tech-blog/static/a717eafa290bf333c4dd1c86076c5b9e/fcda8/node-js.png\"\n        srcset=\"/tech-blog/static/a717eafa290bf333c4dd1c86076c5b9e/12f09/node-js.png 148w,\n/tech-blog/static/a717eafa290bf333c4dd1c86076c5b9e/e4a3f/node-js.png 295w,\n/tech-blog/static/a717eafa290bf333c4dd1c86076c5b9e/fcda8/node-js.png 590w,\n/tech-blog/static/a717eafa290bf333c4dd1c86076c5b9e/efc66/node-js.png 885w,\n/tech-blog/static/a717eafa290bf333c4dd1c86076c5b9e/d9199/node-js.png 960w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>This is the part 2 of post <a href=\"https://alamgirqazi.github.io/tech-blog/intro-to-nodejs-part-1/\">Intro to Nodejs - part 1</a>.</p>\n<p>In this, we will continue from the express application we created and build a very simple Auth system.</p>\n<p>What we need is a method to Login, a method to Signup and a method which returns us a list of students. We should only get the list of students if the user is authenticated / logged in.</p>\n<p>So lets go.</p>\n<p>Before we start, we need to know two things. GET and POST methods. GET and POST methods are used to transfer data from client to server in HTTP. The client can be a web app or a mobile app.</p>\n<p>GET method is mainly for getting some data from the server. POST method is mainly for sending data to the server.</p>\n<p>Before login, we need to add students. To add students, we need to send data to server (student name, student email, password etc). that means we will create a POST request.</p>\n<p>Here is what the post request handler would look like.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">app.post('/signup',  (req, res) => {\nconst body = req.body;\n\nconsole.log('req.body', body)\n\nconst email = body.email;\n\n// we need to check if email exists already or not\n\n// if email exists, throw error\n// otherwise\n// insert into database\n\n// Once saved to database, we will send response back to user with message ' User signup successfull'\n\n\n  });</code></pre></div>\n<p>We will write actual code after we set up MongoDB but first we’re trying to understand how it works. Lets say, our Signup feature has now been added, lets add a Login feature. Again in Login, data will be sent to server so again it will be a POST request.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">  app.post('/login',  (req, res) => {\n    console.log('req.body', body)\n\n    const email = req.body.email;\n    const password = req.body.password;\n\n// 1. find if a user exists with email\n// 2. if exists, check if password matches\n// 3. if password matches, Success. (in case of success, we should create and send a token(jwt token))\n// 4. otherwise, send error\n\n  });</code></pre></div>\n<p>So, now we know we just need to create these methods, so lets head over to <strong>MongoDB</strong></p>\n<p>MongoDB is a nosql database. It is very different from sql databases such as mysql, postgresql, SQL Server etc.</p>\n<p>But still, mongodb has some similarities with sql databases.</p>\n<p>MongoDB has collections instead of sql tables.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/a224053eb69510f30cf398a221371698/4d08a/nosql.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 39.86486486486486%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABJ0AAASdAHeZh94AAAB8UlEQVQozy2QW08TURSF58WQWAEFFFFALlooUOltptNOZ6YtZW6dlpYQotEHghKNvio2igkqKuivUJSL/sjPPSMPX9bZ+5yzztpHuZTd5vLKBxL19yRW9kk0PtK/+okB94Br/heGgq8M+wcMR9o8ZCQ8ZLT9jevhkeiR6CFXvc8MBN8Z1J+i9K/uc2/njIWdY6a2fnH3yQmzwvT2Calnp6RfnDP26AeJjWOubP5m8IH0n/+RvTOWX54zuXVKX/cnfZt/SVR7KAP5xwzV3zBSf8WNxi6jjdfcXN1l3H/Lnea7/wQ9piIN96TeY0L2xr0et90eYxFOj1F3jxHtIUpyboFcLi8U0HUd13EIXBe7YgoGVbMSU7NMahca+q7g48nZerWGVlBRVZXk/KIYLmbIaWXygl62cP0WYauDbdexrBqWqHmhcS14fkjQXMPxQuyaQ6ZQIivMzC2hzIlhXi2hFg2KpQpF3ZCkBpWKJZerMdHaNG1Rm3LZRJOz+YJONl9kOauRzqqkMwUmZ+dRFu7nKGiGvNSg092gvdZlfX2DTmcd1/ViI9OsYhgWjhPQanclXZumTOEFbXxJuiL9ZTGfmE6ipNK5OJ2mVzDMKFE9Hs++GLUsRiVJpZfM+Et0qTVZR18UjZmRpEuSLrWU5dbkDP8AjEkdV/TUjQ8AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"Nosql\"\n        title=\"\"\n        src=\"/tech-blog/static/a224053eb69510f30cf398a221371698/fcda8/nosql.png\"\n        srcset=\"/tech-blog/static/a224053eb69510f30cf398a221371698/12f09/nosql.png 148w,\n/tech-blog/static/a224053eb69510f30cf398a221371698/e4a3f/nosql.png 295w,\n/tech-blog/static/a224053eb69510f30cf398a221371698/fcda8/nosql.png 590w,\n/tech-blog/static/a224053eb69510f30cf398a221371698/4d08a/nosql.png 709w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>I have written more about nosql databases <a href=\"https://slides.com/alamgirqazi/nosql#/\">here</a></p>\n<p>Okay, so now we need to set up MongoDB.</p>\n<p>Download MongoDB Community Edition from <a href=\"https://www.mongodb.com/download-center/community\">here</a> and a tool to visualize your mongodb database, <strong>Robo 3T</strong> from <a href=\"https://robomongo.org/download\">here</a>. Choose Robo 3T (formerly Robomongo) on the right.</p>\n<p>Okay, all set. now we need to add mongodb to our existing express.js app.</p>\n<p>MongoDB has an excellent ODM (Object Document Mapper) written for it called <a href=\"https://mongoosejs.com/\"><strong>Mongoose</strong></a> which helps us alot with queries etc. We will use that. Think of Mongoose like an ORM for a sql database.</p>\n<p>Lets install mongoose</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">npm install mongoose</code></pre></div>\n<p>MongoDB runs at port 27017 locally by default. So our database url will be localhost:27017/myfirstmongodb or whatever.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">mongoose.connect('mongodb://localhost:27017/myfirstmongodb', {useNewUrlParser: true});</code></pre></div>\n<p>just this code added to the top and our database / mongoDB has been connected. It really is that simple.</p>\n<p>Okay, lets talk a little bit about our students.</p>\n<p>We can think of students as our Models (like th M in MVC). a student will have email, student_id, password, name at the very least. We represent this in a model. lets create that model using mongoose.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const Student = mongoose.model('Student', {\n  name: String,\n  student_id: Number,\n  email: String,\n  password: String,\n  date_added: Date\n });</code></pre></div>\n<p>we also need to add one more module.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">npm install body-parser</code></pre></div>\n<p>after this, add these line</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const bodyParser = require('body-parser');\nconst app = express();\nmongoose.connect('mongodb://localhost:27017/myfirstmongodb', {useNewUrlParser: true,useUnifiedTopology:true});\n\napp.use(bodyParser.json());\napp.use(bodyParser.urlencoded({\n  extended: true\n}));</code></pre></div>\n<p>Now, we have set up the model and setup bodyParser middleware. Lets write an actual <strong>Signup</strong> POST method.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> app.post('/signup', async (req, res) => {\nconst body = req.body;\nconsole.log('req.body', body);\nres.send({\n  message: 'Success'\n});\n\n  });</code></pre></div>\n<p>We can use browser for GET requests but for POST requests we would have to use a client (mobile app or web app). There is an alternative. Using <a href=\"https://www.getpostman.com/\">Postman</a>. Install it.</p>\n<p>Okay, now lets run our Node.js app</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">nodemon index</code></pre></div>\n<p>Lets test route <a href=\"http://localhost:3000/signup\">localhost:3000/signup</a></p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/0260ccf577a669d4054fa76d11707b13/c391c/notfound.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 64.86486486486486%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABJ0AAASdAHeZh94AAAB+UlEQVQ4y62T6WsTQRjG96+qCv4pLWkSNeLZHHtlSRs1+MFvKkWsRYTUo1CsR9pivfDEEo/WfhD1g4hi0mySPbvJno+zkwqrCUigD/zY932HeeadmR1mrbqO2atlLN6poHx9HuenZ8HxEjihgAybR5bLI0fy4xMcMjkB6QyPHCtClKbAknqW1E6mWQKHvfv2g3n/YROarsM0t9Ht2rBtG77n4V8ZqopGU4PcNil1WcNWU0etoaCpmJSxWAJMtfoOlmXBIyZWp0PiLr7VNJxZrSN3vwZppQ5+qQb+7g98b5jQjA7amgVFt6AaXfzaauHzl69wXA+xcWL44tUbqKoCnXSpKAqJNfxsqFj+ZGBhQ8XipkZZIbne8eB6Pmy3h+MF2CYNhPNCjceTYC7NXIPSbkGWZbRabTpoGgYGK0AQBOTTg8YRJQ8cBJMlBz9Inh/0EfGKEMD3fTonniAdpjMsTcJisLPqn5Wj+f8IFQsv5cjRE32GwyjaYSp1iBgem/jLcFhFmzicSoER8lMDtzws9AzjZMunSud6l0D+w5DQOEpYc3fGXNftw3EcSqjR0TEw87cr2C0lE6TDyzNXsL7xEQ8ePsa9yjKePHuJ12tv8ejpcxqXb9zChYvTmJu7iVLpLAqTRRSLpyFJBfLmBQiCAI7jIYoiRkb24DdOtKTesrFBLQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"Not Found\"\n        title=\"\"\n        src=\"/tech-blog/static/0260ccf577a669d4054fa76d11707b13/fcda8/notfound.png\"\n        srcset=\"/tech-blog/static/0260ccf577a669d4054fa76d11707b13/12f09/notfound.png 148w,\n/tech-blog/static/0260ccf577a669d4054fa76d11707b13/e4a3f/notfound.png 295w,\n/tech-blog/static/0260ccf577a669d4054fa76d11707b13/fcda8/notfound.png 590w,\n/tech-blog/static/0260ccf577a669d4054fa76d11707b13/c391c/notfound.png 673w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>This is predictable because we wrote only POST method and not GET method. So how do we test POST method? using <strong>Postman</strong>.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/a22914c43f5b39018b5eaf5ed4044eb3/d93d9/postmaneg.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 66.21621621621621%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABJ0AAASdAHeZh94AAACkUlEQVQ4y42Ry08TURTG529yRWxijJoYlm5cqIENURNJDGBcEE3AaFyoiRtE5FlAwsqKQtRKxSAIRXH6GloI2FK0RortvGd6Zzqf507BJwtu8pvvnDMz37n3HuHdzBwikTk8n17E1Ot5TIbnMEWEpmYwHgpjLDSN8YkIgmNP8aB3mBhBd9+or4/6H6OP9H5XPx5SrfPmHQgT7fUIXQ2go+UU2puO4tqFY7h+8QSuNATQfPoQOpsCaG+sQ8u5OrQ1HEbL2TqfVopvXTqJe+ePo7UxgNuX69F85giEbHQYLBNEWeyDHBuBIY1CTwWhS0NEEJY0CHtliOqcQZgUa8kBbC91QV7uBjID8NI9YOleRJ/cgBBLpqFVCpANA6aVhenqqABgu/C44v2G1wwHsOhFdMvE3fkCZrPw15KYgbAUnYWuvYciF1AsvsD3bx3Y2e6BqmhU+wFVLlFchqbKpLKvslyGrcl4u/oZbc/eYDJegmeriC4uQIjHE3Bd6mhYME3qruRglGOwbUY5A2MuqtXqf7j8p1+rFovLHyEkkik4zhpcp0zK4Lge3Cp9Qg/TzJOq8Oioe0YeJZZlUUObcg8Vx0WF0R2gSobLEFakJBl9oMLObjdvF9BPC2T4xTf0vJoZh++O82fu71AUa4bUDKpqEAo03YCsqNBJa0Z/m+3HnmEiEacpx0RYtglFUeiyZZg0AFstwzVUOgXDQRa/Cr5WUgkyFD9B0zSacBGlUgk7xW2augqXVWggzMdxnH0H8++AEvEYhI31NX8A3FTXdf+o/MIdS4dLVAkw60A7laQUhJlIGFIqBb7TdFrC2mqGXnBdxcb6OrbyeeQ3N7FJ5LJZ0hzVKM/l/Difr9ULha8Iv3qJn2tXpQRiYDAcAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"Postman Example\"\n        title=\"\"\n        src=\"/tech-blog/static/a22914c43f5b39018b5eaf5ed4044eb3/fcda8/postmaneg.png\"\n        srcset=\"/tech-blog/static/a22914c43f5b39018b5eaf5ed4044eb3/12f09/postmaneg.png 148w,\n/tech-blog/static/a22914c43f5b39018b5eaf5ed4044eb3/e4a3f/postmaneg.png 295w,\n/tech-blog/static/a22914c43f5b39018b5eaf5ed4044eb3/fcda8/postmaneg.png 590w,\n/tech-blog/static/a22914c43f5b39018b5eaf5ed4044eb3/efc66/postmaneg.png 885w,\n/tech-blog/static/a22914c43f5b39018b5eaf5ed4044eb3/c83ae/postmaneg.png 1180w,\n/tech-blog/static/a22914c43f5b39018b5eaf5ed4044eb3/d93d9/postmaneg.png 1243w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>Once we click on SEND, we get a response.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/0e72394fbdf4123bc3d3f67a81c94c31/8698d/postmanresponse.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 64.86486486486486%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABJ0AAASdAHeZh94AAACZ0lEQVQ4y62Sy08TURSH5+9xRYhRosa4809wI5GNGF1p1AisNJKAiSbgAlGCaCTB8LBUHomiIdENtFMqCC20hQKK1oS+pvPqvD7vTBFNRN14ky/nd+acex6ZK81OTvNq6jXDE7OMjAsrGAnPMDg8Rf9giIGhCZ4IevuH6O4Z2Ker5zEPHj2jr/cpd+/30dM3SHtnF1L4WgPhlqN0XDnNzfMN3L5wjPaLJ2g7V8/VM4fobD7MraY6Whrrgm83ztZ0q9B3Lp2ku/k4rU313Lt8iuuNR5ByKyHcrRDa2ihmZlzoCZzNCWEncban8ITP9iTePlPY2TBKchhj7Tl8GhWMwdYL0u8eIq1mdihqHkXVQVFtFBN0BwxX4NTQf8H3K1XQdJv3WWibgelVsET+SvozUmJlmYpSQikX2c3n2c3tkP/2RfglyqVCYP24WikLW0YVKAJTLSJnFTrelHmbLOEYZRIrH5EymQyWZWNoFVRNRxWFK8UChmGg67qIWbiuewAe4P4CZFJrSKlUGtM08DyvBj+Ppmk4jhPoH3H/+M1M08R3bcfDskWOa9UKZjc3qVatAyfwL9m2/VvMFk18fO3s+cGEYlspk1jENv31tGAiTa9pw9DFdHZQ0LatP+Lnq7oZTJlKp5GW4zEK+QKFUiWgpGgUyxU0RaFquwLvn5iWI3BZX19HWlpaFF1M9IroJJ6OYXpiBVd09PYKOlStv2NW7eC3bPgFsxsZ/tfJ5b4ihcaGiUbm+bAQIyneUWotSTweJ5lcJZFIBDoqy0SiUebn5pCj8yzEIsEdWY4QX5CRI3PEYjIvw+N8B0csp1p1XqR7AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"Postman Response\"\n        title=\"\"\n        src=\"/tech-blog/static/0e72394fbdf4123bc3d3f67a81c94c31/fcda8/postmanresponse.png\"\n        srcset=\"/tech-blog/static/0e72394fbdf4123bc3d3f67a81c94c31/12f09/postmanresponse.png 148w,\n/tech-blog/static/0e72394fbdf4123bc3d3f67a81c94c31/e4a3f/postmanresponse.png 295w,\n/tech-blog/static/0e72394fbdf4123bc3d3f67a81c94c31/fcda8/postmanresponse.png 590w,\n/tech-blog/static/0e72394fbdf4123bc3d3f67a81c94c31/efc66/postmanresponse.png 885w,\n/tech-blog/static/0e72394fbdf4123bc3d3f67a81c94c31/c83ae/postmanresponse.png 1180w,\n/tech-blog/static/0e72394fbdf4123bc3d3f67a81c94c31/8698d/postmanresponse.png 1239w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>But something else also happened. Remember we added a console.log(‘req.body’, body) before sending the response.</p>\n<p>Here</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/6935a888026cd4f1989c85aeead40e26/fcb94/cmderres.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 452px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 39.86486486486486%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABJ0AAASdAHeZh94AAABS0lEQVQoz02R23bCIBBFYYgktrq8RJIQk2jjpWrr/3/e6QHS2oe9hhmYzU3pg4b+Jg+y15C9QF8Yz8zD3IdKccNaxXgjPcmZC6N+ISJQ2jMZyZGwQWrSCyRIthpqT2HDcZaQeZJpQ+S/7FfYsemTTVedGrmBxA1UPLEeON9yvOR4nfK4ziZhkCRZEqvYFGS8pq6nxf0kraZn6NLJ5D2d2qwFJpMoM8YgI3/CsLu6TFTEEb6b6qb8QDyx5G2aX5GMqBdBHoV+bNFd91i1K9RDjeHSw/UO/a3DrtnBeYfjeYBvPXbbEm5boWtanMYTvG9Ii+fzCWtnSXgYjjgdR5zHM+qqRtt4PO5fWL4tkLkM9m5hB4uN22C5YG2WoShyzOdzFHmOnCxCPV6bn1KWZTRbayEmvYvNLWu8ipCCzHil8JPxjdT0s68YasZI5AddWrGtA6Lf8gAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"CMDER Response\"\n        title=\"\"\n        src=\"/tech-blog/static/6935a888026cd4f1989c85aeead40e26/fcb94/cmderres.png\"\n        srcset=\"/tech-blog/static/6935a888026cd4f1989c85aeead40e26/12f09/cmderres.png 148w,\n/tech-blog/static/6935a888026cd4f1989c85aeead40e26/e4a3f/cmderres.png 295w,\n/tech-blog/static/6935a888026cd4f1989c85aeead40e26/fcb94/cmderres.png 452w\"\n        sizes=\"(max-width: 452px) 100vw, 452px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>What happened here is our Node.js server was hit with a request for signup and the data we got was {\nname: ‘Alamgir’\n}.</p>\n<p>This means our flows are ready. now if we add other values then they will be added themselves.</p>\n<p>Once we get the full data, we can add that to the database after checking if it doesnot exist already.</p>\n<p>So, let update the code to save it to MongoDB.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">app.post('/signup', async (req, res) => {\nconst body = req.body;\nconsole.log('req.body', body)\n  try{\nconst student = new Student(body);\n\nconst result = await student.save();\nres.send({\n  message: 'Student signup successful'\n});\n\n  }\n  catch(ex){\n    console.log('ex',ex);\n    res.send({message: 'Error'}).status(401);\n  }</code></pre></div>\n<p>Now lets try again from postman</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/aafdf2829658dee94b62b8280f5d7133/60b8f/postman2.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 64.86486486486486%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABJ0AAASdAHeZh94AAACPUlEQVQ4y42SSU8UQRSA+9+IgQuJigfjz3CLHjRojDcVjAcNxHjQ+CM8GMBlBEZmBhgWT170ZDwTnGgEZu29p7q65/NVNz0SPGglX96rV2+rV2V9qS6yWf/IUm2b0vIapXKdpcomr99XmXu7wsLiKvOlKgulCvPvDCsZc8JieZ3q0iqv3nwQ/5r4VLFqd0d4OX2OmdvnmZ08zZNbEyLPMH1ljHsXTvBscpxH18ZkP8qDy6PcvzjC1KWTTIn+9OYEL66f4uHVUZ7fOcvMjXGs9NcG/KySfK/A3hocbOQ0t0QKTdFbm8LWIduwXyfeLUNjWfZVaNfgRyXD6nkxzV4f21P0XIUdDghihviFrg4R3QnB9RWfdlMeb6SUviUEocaJwLLtLo7dw3FsOt0Ozf09up02rtPL7K7YPdfG91w8z8lxXfq+zeddj9l1h/JXB+V18cXP6vf7RGGIikLCKCLotYg8m75ShGLXWpOm6ZDBYECSJGgB0iGp7JNYYZkgJcFpmmTBSRaYB5kzk8AsI4uEkRQ2jRi/OEkzUiXFVYS1s7OD7/vDoKMYu0lqiOP4r/PjmCasRqOBKzMx1YukhSyuaxyL7o6Tr1xmCf0glPZVHnhkVkY3XR2dX4EpVBTTOp+nlmsbaQWdA8LAk7mE+EEgzy8P43v0o/xBtCTV+hhxgcr9I0XWmIqx2q0mnY5Nt+cKPrbryxdyiWR+cTL4J1oeRosMJWksDVitdluGruTraKkGSiNOEBv+I+EfyK79G9xpuuirE0F1AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"Postman\"\n        title=\"\"\n        src=\"/tech-blog/static/aafdf2829658dee94b62b8280f5d7133/fcda8/postman2.png\"\n        srcset=\"/tech-blog/static/aafdf2829658dee94b62b8280f5d7133/12f09/postman2.png 148w,\n/tech-blog/static/aafdf2829658dee94b62b8280f5d7133/e4a3f/postman2.png 295w,\n/tech-blog/static/aafdf2829658dee94b62b8280f5d7133/fcda8/postman2.png 590w,\n/tech-blog/static/aafdf2829658dee94b62b8280f5d7133/efc66/postman2.png 885w,\n/tech-blog/static/aafdf2829658dee94b62b8280f5d7133/c83ae/postman2.png 1180w,\n/tech-blog/static/aafdf2829658dee94b62b8280f5d7133/60b8f/postman2.png 1217w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>press Save</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/379046bc804495ad48b02f5ad20ac3c2/44c61/consolecmd.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 485px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 31.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABJ0AAASdAHeZh94AAAA50lEQVQY05XO23KCMBSF4YhgAhRIQJTzObb6/u/3N1ovS2d68U0u9qyVJdIhJd5ijtMRWUrCJiQePjB3TVImFJ85RZ2TZRlpmqKN5lyW5HmO1pq6bgiV4nQ6IaVELMuKtZa+6+naDrtY7vZB1zTowQUeFe3S0lwaTGa4lld366mqisulZJ4XlJIEQfAinr9sm2VdV6I4RLUK82UQZ4GYnM3pnMHJnMhJHbHj6PvMbuXNbhRFgWl/yg61hyc9RPAuMe9Xult0wPO83wuTJGEYR8ZxYJ4m4ih+hf3ERwVqf8me56p/h/7wDWVKhzOKdfvUAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"Console\"\n        title=\"\"\n        src=\"/tech-blog/static/379046bc804495ad48b02f5ad20ac3c2/44c61/consolecmd.png\"\n        srcset=\"/tech-blog/static/379046bc804495ad48b02f5ad20ac3c2/12f09/consolecmd.png 148w,\n/tech-blog/static/379046bc804495ad48b02f5ad20ac3c2/e4a3f/consolecmd.png 295w,\n/tech-blog/static/379046bc804495ad48b02f5ad20ac3c2/44c61/consolecmd.png 485w\"\n        sizes=\"(max-width: 485px) 100vw, 485px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>We see the data in cmder.</p>\n<p>But is the data actually saved in Database/MongoDB? lets take a look.</p>\n<p>Open Robo 3T.</p>\n<p>connect to localhost</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/23d9501a9a493bfc59ad319431b7c487/7762d/robo3t.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 91.8918918918919%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAABJ0AAASdAHeZh94AAADbUlEQVQ4y2VU227bRhDlV/a1X+DHIEBfgtpVGisNkqJ/0YcWCFA4iGTJDhIjdhLdbF1oSTZv4kUiZUq8S5ROZ1alGiQEjparXZ6dM3NmpbOrjxipClRtAs2wMLGmMG3GDKo+QavVRrPZQqPRRINHQjFvtTpo0nqj0UK318Pjxz9Buh0NkWYJgiBAFIUCcRQhjiMkSYz1eg1+ttst/+7Bc8Zmk+/3vPr9D0h/vz7BzPPhODYMw8B0NsNkMoGqqpjRe7AMxGHL5RKLxeI78P8PDw9EvsHx8W+Q/jmpkEwHhq5jNBpB01Q40yk8zxMf2J4N0zLpQEf85809zOdzMRbgg7NVhnKZCBVVw1VXxfX1DSzLgu/7JDtClmUkOYEXeIhCkh8mWK9ypHGKJEqQRimyOBNjFERCcrn8HJIs32JCUofDIWauizzPiSwVZKtshSgN0bf7MB50TIMZxu4Yhm9A8RSMZ2PIjoyB1YcdWzgslSCdv3uP0fgOnXYTQypQECx3BYpjpEkKP/ZRvauiaTRx7yow5gYs34I21wSh6mnQPR3RNkTp2TNIb07e4N5eoNVVMLpV0e2OYNuOkM1SlukSbb8NK7Lgxq6QRnXlOuPbp/z8BaSz+jkCskdv/AjXnR+gKD+SXLJSukWWUq5WCXSS6/gOTN/EHUVlLkwE63BnG6puYZtjLkq9dgp7scaX7gcY2inCcEg5ZA9SHomQN1smSaTi2aYNTdFobotCFf7cbDb/RUhFqVYqMB0P1717mKYnIhNkVJQ0TakwGVXfhE620jRNeFWlzmJHbL8hfPmSJFeqNTGJo0B0BiOlyJiQrcNdI8uy8Gi/38eA3pmc1wqiYiyVnkKqUQ754SJwRAwm20e4WglTuzMXUzI8w7ZtqIoq1r8mPDr6ZWebgrAgKUgLyTuZLHciomMyx5l+F+Hh4RGkVudGNHscx/vICrAsviwGLHUwwHg8Fnm8o9HQDarw7oLI868IVU0XsiJxw/xPyu8cIY+cQ86fZdmin/ky4DGj75iwsM2TJz9D6rTb+7AZOS3m+VpsYnAb8mEhdc/CX4j8udSinFM+mPcUuSw9/RXS67/+xOXlpUCj0aBIZLos++hTVPLtEJ2bHq4+fcLnz19ozxXOz9+hXj8j1FGr1VCtnuLt2wouLi5wcHCAfwGkSC5CfhLi9gAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"Robo 3t\"\n        title=\"\"\n        src=\"/tech-blog/static/23d9501a9a493bfc59ad319431b7c487/fcda8/robo3t.png\"\n        srcset=\"/tech-blog/static/23d9501a9a493bfc59ad319431b7c487/12f09/robo3t.png 148w,\n/tech-blog/static/23d9501a9a493bfc59ad319431b7c487/e4a3f/robo3t.png 295w,\n/tech-blog/static/23d9501a9a493bfc59ad319431b7c487/fcda8/robo3t.png 590w,\n/tech-blog/static/23d9501a9a493bfc59ad319431b7c487/7762d/robo3t.png 649w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>double click</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/931701f3b18ab2b1b88de56a593f2e32/95e27/robo3tsaved.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 49.32432432432432%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABJ0AAASdAHeZh94AAAB0UlEQVQoz52SWW/TQBDH/f0/RCVEEUitaCFXaUt54YEehEo53ST2+oiP2F7bxYmP2Pkzu5iHCvHCSD/tf/YYzcyOMprPYZg2XG8Dx/Xgb0KEUYxNELWEMC0LpmkSFgzDfAEzDDDGoOs6VFWFoukGvDUDs0x4noskTbDdZsQWu5aiKFCWJa251H+Ty/M0TaE8jlUslwvKKpSHzDYw/PGIhabhabHEiladGdB0BnvttjiwHRdrp9WE6/lgVIEynkxlKSKjpmkwG4/w8f0JBp1zXPY/4Oa6i6tBB1c90p96ki+XfXy+6NJ5h/w+rgddnJ+d4qJzBmWqLjGaLaBRJnVV4Gbi4GToozuO0JtwDKYJTsl/9+Dj+D7A67sNXt0K7ePtvYc33yMcPwQ4+ubh6KtJAZ+oNM1Clv2UvYiyEnMrgO6nCLYNUWPlJridaBgubMnM5mDhDvomg51UEue5hh5kUMTP7na/G7/Lc+DQYPucIOEh/thhX4LSF6pFWNPu4cU9JaCxqKoKOQUTCL3f16jrBofDQSJ002pB09Ae9buua7kvfGHiPQUMZICiKOXXi0v/ayIZZUUjwzlHGIaSOI6RJCmRSDiPEUWciP4JJ+KYyzn+BZmM51Rpn6YjAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"Robo 3t\"\n        title=\"\"\n        src=\"/tech-blog/static/931701f3b18ab2b1b88de56a593f2e32/fcda8/robo3tsaved.png\"\n        srcset=\"/tech-blog/static/931701f3b18ab2b1b88de56a593f2e32/12f09/robo3tsaved.png 148w,\n/tech-blog/static/931701f3b18ab2b1b88de56a593f2e32/e4a3f/robo3tsaved.png 295w,\n/tech-blog/static/931701f3b18ab2b1b88de56a593f2e32/fcda8/robo3tsaved.png 590w,\n/tech-blog/static/931701f3b18ab2b1b88de56a593f2e32/efc66/robo3tsaved.png 885w,\n/tech-blog/static/931701f3b18ab2b1b88de56a593f2e32/c83ae/robo3tsaved.png 1180w,\n/tech-blog/static/931701f3b18ab2b1b88de56a593f2e32/95e27/robo3tsaved.png 1199w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>Congratulations! Your student has been saved to MongoDB. that wasn’t so hard right.</p>\n<p>So what have we done? We have inserted a student into mongoDB using a post request.</p>\n<p>Now, I wanna retrieve all students inside my database. For now, I have inserted 2 more using Postman.</p>\n<p>Okay, so to retrieve, we get to get data from the server (Node.js) so in order to do that, we need to write a <em>GET</em> request.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">app.get('/students', async (req, res) => {\n\n  const allStudents = await Student.find();\n  console.log('allStudents', allStudents);\n\n  res.send(allStudents);\n});</code></pre></div>\n<p>This will return all the students in the database.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/0a3238ced70684bb14f38ea9e26a0a7a/99375/GETstudents.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 53.37837837837838%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABJ0AAASdAHeZh94AAABM0lEQVQoz51SCU7EMAzMe3kOD+EP/AQJIbrQJmmawzkHp9kCErvaFVVHThpnas9YSKWgtMY8zzs0r40xN7EyrNF4mTQengwenzWiVRB2OSFYgxACYqQ9eu9BRLyPO1JKyDn/BX+nmCBdxup5HwNEThGtVrQG8IvCa+fcTnyQd8LGCZXRLgCofLnu58Kvar/USXzwCM6i8E9qLSiloJYeM0q+DqIIT4nvE8RpmqCNg7HEkbBtvd2EWBpirox2E6kMdFIh2YTkI+ZXi48J0Arc6miv1nO8hXrkAkKxy4WFDRuxVo1bGIf/ebqeoo9NDhHq3ULOjTX8IWxXTLhszJlwkQvbzYKuBOqtliOhDedbu6uyXxVKrpAg3zZ8Tg1uG6T/JlyWhcckI7qh4ZhGfFd5r3ZH/AIyiF6v92IWjwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"GET students\"\n        title=\"\"\n        src=\"/tech-blog/static/0a3238ced70684bb14f38ea9e26a0a7a/fcda8/GETstudents.png\"\n        srcset=\"/tech-blog/static/0a3238ced70684bb14f38ea9e26a0a7a/12f09/GETstudents.png 148w,\n/tech-blog/static/0a3238ced70684bb14f38ea9e26a0a7a/e4a3f/GETstudents.png 295w,\n/tech-blog/static/0a3238ced70684bb14f38ea9e26a0a7a/fcda8/GETstudents.png 590w,\n/tech-blog/static/0a3238ced70684bb14f38ea9e26a0a7a/efc66/GETstudents.png 885w,\n/tech-blog/static/0a3238ced70684bb14f38ea9e26a0a7a/c83ae/GETstudents.png 1180w,\n/tech-blog/static/0a3238ced70684bb14f38ea9e26a0a7a/99375/GETstudents.png 1525w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>that is excellent.</p>\n<p>So now that we have our students in the database, lets write a login method for them. What it would do is check by email if the user exists, if it exists, then it will check for password.</p>\n<p>For login, we have to send email and password to the server from (mobile/web/client) so again, it will be a POST request.</p>\n<p>here’s how the login method would look like for now</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> app.post('/login',  async (req, res) => {\n    const body = req.body;\n    console.log('req.body', body);\n\n    const email = body.email;\n\n    // lets check if email exists\n\n    const result = await Student.findOne({\"email\":  email});\n    console.log('result', result);\n\n    // 2. if exists, check if password matches\n\nres.send({\n result: result\n});\n\n  });</code></pre></div>\n<p>if the email doesnot exists, the result will be <strong>null</strong> otherwise we will get the object.</p>\n<p>lets see</p>\n<p>alamgir@gmail.com doesnot exists so</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/f11d87a24efeeb395900194c0159435c/b1c31/noemail.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 47.972972972972975%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABJ0AAASdAHeZh94AAABM0lEQVQoz6WRv07EMAzG87K8CS+DWNjRzQxIiIUJhBDDgdS7y58mTZyk/bBzLagnMRxE+qm2a8ufbZVzQSVCKTiSIoZhaBSKqLVimqZfCSFAaw3vI9sD1MfnI/a7e3TdFfb6Ds46Tji0JGs0nHPoe6FfIXHn2LYaz1uNi+sNLm87qOANer/nn68w3UtTJl1TSqBckRmizNCKnHODKCFEwvthh62JUClZFB6b0giKCZXnljWUIgUW4+h5NBkbq1GlYZEdtTd9f1XOD7MztvCxgL2RO4cNYrxhezfHxobkiLplv0tcUJR4BGaI1OQnPoqoE0RtrXn2ywnruCgOMUMZY2HsAdZZxiM4wwkVpY5nkbmGCiv0foIPT4j0hsQrkUNQmc6nHlE/S10W+7+nliOcXvGvfAHDtw1+9a991gAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"NO email\"\n        title=\"\"\n        src=\"/tech-blog/static/f11d87a24efeeb395900194c0159435c/fcda8/noemail.png\"\n        srcset=\"/tech-blog/static/f11d87a24efeeb395900194c0159435c/12f09/noemail.png 148w,\n/tech-blog/static/f11d87a24efeeb395900194c0159435c/e4a3f/noemail.png 295w,\n/tech-blog/static/f11d87a24efeeb395900194c0159435c/fcda8/noemail.png 590w,\n/tech-blog/static/f11d87a24efeeb395900194c0159435c/efc66/noemail.png 885w,\n/tech-blog/static/f11d87a24efeeb395900194c0159435c/c83ae/noemail.png 1180w,\n/tech-blog/static/f11d87a24efeeb395900194c0159435c/b1c31/noemail.png 1413w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>Okay, so lets try with an email that exists.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/bb26690391fd2efc6b5240e7212bc7a4/5440e/studentexists.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 47.2972972972973%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABJ0AAASdAHeZh94AAABIElEQVQoz52R3UrDQBCF9519Fd/ER/BGEC9EEPFCQbBt2iTNZtPs7F+OZ9JiLAhKBz5mcyZ7cjZrNpsNqqpC3TTY7nZo2j36voe1ll3p4Jw94c7otXP+UXW4uulxfetgvPcQMo4jDjQY2hpeZH6OEch5IaVM0kymoMxrgpJQcoLRJCGE0zCyc1AyAfU1RB5o/Ej9BdyFacJcukfRmiiqrt1odDU6ikcK3dQwxk94f0fTe66fqGmyglyWpPrukjbD9PUawxCJwA0Du4OMx4/oSZbj4tvkN0QCRokw1bbFvntGZ9/QdpmX4vnDBSFPCKmQ/IPpT0zTWCR5h129YrsCeGlgSKaazn7DfzF1vZuPIy4jhnQ2vKSYsJ1vdanF6JKEX1EMvwvYkFwVAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"student exists\"\n        title=\"\"\n        src=\"/tech-blog/static/bb26690391fd2efc6b5240e7212bc7a4/fcda8/studentexists.png\"\n        srcset=\"/tech-blog/static/bb26690391fd2efc6b5240e7212bc7a4/12f09/studentexists.png 148w,\n/tech-blog/static/bb26690391fd2efc6b5240e7212bc7a4/e4a3f/studentexists.png 295w,\n/tech-blog/static/bb26690391fd2efc6b5240e7212bc7a4/fcda8/studentexists.png 590w,\n/tech-blog/static/bb26690391fd2efc6b5240e7212bc7a4/efc66/studentexists.png 885w,\n/tech-blog/static/bb26690391fd2efc6b5240e7212bc7a4/c83ae/studentexists.png 1180w,\n/tech-blog/static/bb26690391fd2efc6b5240e7212bc7a4/5440e/studentexists.png 1419w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>When the email exists, we will get an object in result instead of null.</p>\n<p>Okay, so lets write an error in case the email doesnot exists.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">   app.post('/login',  async (req, res) => {\n    const body = req.body;\n    console.log('req.body', body);\n\n    const email = body.email;\n\n    // lets check if email exists\n\n    const result = await Student.findOne({\"email\":  email});\n    if(!result) // this means result is null\n    {\n      res.status(401).send({\n        Error: 'This user doesnot exists. Please signup first'\n       });\n    }\n\n    console.log('result', result);\n\n    // 2. if exists, check if password matches\n\n\n  });</code></pre></div>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/3590736fde3e3e134238f20a3ad8e53c/78363/401error.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 32.43243243243243%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABJ0AAASdAHeZh94AAAA70lEQVQY03WQyUoFMRBF8+9+jB+hO0F058KF4EaEBz5ouzNP1cn1pvuBQ2PgUJekcmtQWmsYYzAvGtP5A3qeYZ2DtRaO0fuBP+B8QPQGLyeHqxuPu1eLGjRUTAkpBiRGbw2THHVGzhkiDa2BtF+ICKmbRl8BCKNgLQnKOr8//Dm9Nxrfo5Rb6oXsd+MMw1rrJY8FB8NbMlSwmp8KChM2qOvWgVCPt4W6XLo6UsoTYr5GLs/IrKGW6cx9Ge7NYnQ7xha23lh2H/c48k+qvNHogYbviGmFmj4XhPhIZi4apMGHztiRSkdZifxP5Qq/afgCYxLSqhfprgsAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"401 error\"\n        title=\"\"\n        src=\"/tech-blog/static/3590736fde3e3e134238f20a3ad8e53c/fcda8/401error.png\"\n        srcset=\"/tech-blog/static/3590736fde3e3e134238f20a3ad8e53c/12f09/401error.png 148w,\n/tech-blog/static/3590736fde3e3e134238f20a3ad8e53c/e4a3f/401error.png 295w,\n/tech-blog/static/3590736fde3e3e134238f20a3ad8e53c/fcda8/401error.png 590w,\n/tech-blog/static/3590736fde3e3e134238f20a3ad8e53c/efc66/401error.png 885w,\n/tech-blog/static/3590736fde3e3e134238f20a3ad8e53c/c83ae/401error.png 1180w,\n/tech-blog/static/3590736fde3e3e134238f20a3ad8e53c/78363/401error.png 1522w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>Now we’re sending back proper error from server.</p>\n<p>Okay, lets get back to login. If our email matches, we need to match the password.</p>\n<p>In the variable <strong>result</strong>, we already have the password so we just match it with <strong>body.password</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> app.post('/login',  async (req, res) => {\n    const body = req.body;\n    console.log('req.body', body);\n\n    const email = body.email;\n\n    // lets check if email exists\n\n    const result = await Student.findOne({\"email\":  email});\n    if(!result) // this means result is null\n    {\n      res.status(401).send({\n        Error: 'This user doesnot exists. Please signup first'\n       });\n    }\n    else{\n      // email did exist\n      // so lets match password\n\n      if(body.password === result.password){\n\n        // great, allow this user access\n\n        console.log('match');\n\n        res.send({message: 'Successfully Logged in'});\n      }\n\n        else{\n\n          console.log('password doesnot match');\n\n          res.status(401).send({message: 'Wrong email or Password'});\n        }\n\n\n    }\n\n  });</code></pre></div>\n<p>Lets see it in action</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/3f40effbf70861b8b8e9c86f51d5514b/7e11a/incorrectlogin.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 64.86486486486486%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABJ0AAASdAHeZh94AAAChklEQVQ4y52R20uUURDAvz8oSCmoJN/6O4KSAsl6qKcoqIR68AIppcmGD6YRliEq4t0KfFF3dcPc3czV1uvu4u5+t/2u+/0651MXe+ilgR8zc87MnJk5ytfhISaGRxj4PMnA4Aj9g6MMfByjt3+IN70fiPQNCT7RFemno6v3mNe9vBR0Rd7R/baf9s4Ir3r6aO/oQRl/eIXRR5doe3CNF42XaW2qo+3eVZpvXeDx9XN03LlIy+1ant6sobmhlic3zodIv1XEtdyt51lDDZ3363neWIdSSM9Cbg5/Z0owQ7A/R2V3mmB3Bkf4XmYK9qbhcB6yXwTf4GAOc3McJz0qzicgL2Mmya8NoWz+PkSzQCtXUHWHghmgWwLhF3SfouGjmwIbTPcYTdiW5bGwHdA0GvB+NcByIHNQQtn4mULXSmhqiaNCgaPsPsV8Fl3XxLmKIbTENLSqLe9so8j6nk73gsZ8SsUxSuxmtlEymQyu62GZBma5jKEWMUoF0YFFWfie5xEEQUilUgkJAqkDoHIGsbnDA5R0eitMDpPCYJCh0jdNE9u2Q1zXrRaW8ZKKsF2/guv54NnkDvZREus/UFU1fDmUkyQpMslxnBDf90+ugypVObHz+TzKjphbFgsTRReO64fdyDXIcWWhU6QvOb53sWwHQ3xO2XbxRKeH2RzKr7UVTLE33TDCZRum1Cq2qZ4p9nfhU2QDluNhO65Yi0M2m0VJJhNiZB2tqKGWypRKtsDC1C3xqh/u51/Irs7G5HKiw+2tNKfbCKr/9X9imGWUsZFhYtElvsdjpBJrbG4kicdXSaWSJBIJYceJxWJEo1GWlxbD2PhKNNSx2PKxvbzISizK/NwsfwCW+atgkd2NSwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"error login\"\n        title=\"\"\n        src=\"/tech-blog/static/3f40effbf70861b8b8e9c86f51d5514b/fcda8/incorrectlogin.png\"\n        srcset=\"/tech-blog/static/3f40effbf70861b8b8e9c86f51d5514b/12f09/incorrectlogin.png 148w,\n/tech-blog/static/3f40effbf70861b8b8e9c86f51d5514b/e4a3f/incorrectlogin.png 295w,\n/tech-blog/static/3f40effbf70861b8b8e9c86f51d5514b/fcda8/incorrectlogin.png 590w,\n/tech-blog/static/3f40effbf70861b8b8e9c86f51d5514b/efc66/incorrectlogin.png 885w,\n/tech-blog/static/3f40effbf70861b8b8e9c86f51d5514b/c83ae/incorrectlogin.png 1180w,\n/tech-blog/static/3f40effbf70861b8b8e9c86f51d5514b/7e11a/incorrectlogin.png 1235w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>Using the wrong credentials, we get error response (code : 401)</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/tech-blog/static/0fb34575485a6a68e1b0417c9c4cc1f1/b5dee/successlogin.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 64.1891891891892%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABJ0AAASdAHeZh94AAACbElEQVQ4y42Sa0sUURjH5wNFVygChV71BSIq6E03IrpREUj1wvd+gQgitNJSRFezbDHNRKSgAu22ruum7K6buzuzcztnZs7M/vvP7CVfhQd+nOc857me52hf3s9iaWEJ6flPmH63mJCeW8JU+gNSr+eQmp5PGHs1g9GJ9D9SbzE+NUObWQyPvUl0QyOT0CZuH8bAnW7cv3IcPeeO4sHFLtKNW2cO4eqJPeg9fwQ9Zw/ixqn9uHn6AK6d3IvrJD7fu0C/S8co70Pv5W76d0HTfw4D+UHIX4PwMqMIsqPwM0MIVgchqFOZZ4iyz6HWXiDMvSTDUNkhmCtP4K48BnL9wO+ntBlA5fMjaIUtHY4PONKF42ZgygJcz+MZMBxFIjgighsAMgS8CIksvBDfyg30LQDjP3imrlR1oK3n1mCZJur1ArYrKVT+jKBWzVNnEwO2ZbT2egeT9tKq4euGibuTdfR/rENYOkqFTWjFYglBEMBzBYRgdsMlOjxWKYQHpYAoahN1CGMFdgLo1Qq00laZTgpRqLj7CLmHLSchqkxWpH6T+u0kaKPRSJJJKRFR9lVE+BahD72yDW1leRmWZSWGzdXoZBSij44PyTgDLzRvadeusr3avgY708rlclJRXJ0KQ8J2WrtSxo520aw+vlMqIZaDQMEncbW1GgNurH6H5Ps5nKZlx5Mmjk2dg1A16BgQr5mwFWgnUnpwpQ/p+RxqDVouG095k9NbhG0XScCzC5+Bo6S9/xN3G9uF7ChpOZtdZ1V5SDEDVxiUAdvhn+O/8lmhtxsCdsLAumFCy6/n0JlHZyhtdrfaQzHNOv4CaWq0K+ApBGAAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"success login\"\n        title=\"\"\n        src=\"/tech-blog/static/0fb34575485a6a68e1b0417c9c4cc1f1/fcda8/successlogin.png\"\n        srcset=\"/tech-blog/static/0fb34575485a6a68e1b0417c9c4cc1f1/12f09/successlogin.png 148w,\n/tech-blog/static/0fb34575485a6a68e1b0417c9c4cc1f1/e4a3f/successlogin.png 295w,\n/tech-blog/static/0fb34575485a6a68e1b0417c9c4cc1f1/fcda8/successlogin.png 590w,\n/tech-blog/static/0fb34575485a6a68e1b0417c9c4cc1f1/efc66/successlogin.png 885w,\n/tech-blog/static/0fb34575485a6a68e1b0417c9c4cc1f1/c83ae/successlogin.png 1180w,\n/tech-blog/static/0fb34575485a6a68e1b0417c9c4cc1f1/b5dee/successlogin.png 1237w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>Using the right credentials, we get success response (code : 200)</p>\n<p>So we set up a very simplistic auth system using node.js and express.js framework.</p>\n<p>Here is the link to code. <a href=\"https://github.com/alamgirqazi/simplest-nodejs-auth\">github/simplest-nodejs-auth</a></p>\n<p>To run it locally,</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ git clone https://github.com/alamgirqazi/simplest-nodejs-auth\n\n$ cd simplest-nodejs-auth\n\n$ npm i\n\n$ npm start</code></pre></div>\n<p>In this part, we learned how to connect with MongoDB database. How to create GET and POST requests in Express.js. Very few lines and alot of functionality.</p>\n<p>Btw, there are many things that we do not use in production projects. For e.g we never save password in plain text. we use an ecrypted hash as password. We also have a single index.js file in the project we created which again is not ideal.</p>\n<p>We will cover the best practices in part 3 of the tutorial.</p>","frontmatter":{"title":"A very basic introduction to Node.js - Part 2","date":"October 19, 2019"}}},"pageContext":{"slug":"/intro-to-nodejs-part-2/","previous":{"fields":{"slug":"/intro-to-nodejs-part-1/"},"frontmatter":{"title":"A very basic introduction to Node.js - Part 1"}},"next":{"fields":{"slug":"/intro-to-nodejs-part-3/"},"frontmatter":{"title":"A very basic introduction to Node.js - Part 3"}}}},"staticQueryHashes":[]}