{"id":1483,"date":"2025-05-30T13:15:46","date_gmt":"2025-05-30T13:15:46","guid":{"rendered":"https:\/\/www.wordpress-prod.sharpener.tech\/?p=1483"},"modified":"2025-06-02T11:01:41","modified_gmt":"2025-06-02T11:01:41","slug":"services-in-nodejs","status":"publish","type":"post","link":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/","title":{"rendered":"Services in NodeJS"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.wordpress-prod.sharpener.tech\/wp-content\/uploads\/2025\/05\/ChatGPT-Image-May-30-2025-06_26_47-PM-1024x683.jpg\" alt=\"\" class=\"wp-image-1484\" srcset=\"https:\/\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\/blog\/wp-content\/uploads\/2025\/05\/30125822\/ChatGPT-Image-May-30-2025-06_26_47-PM-1024x683.jpg 1024w, https:\/\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\/blog\/wp-content\/uploads\/2025\/05\/30125822\/ChatGPT-Image-May-30-2025-06_26_47-PM-300x200.jpg 300w, https:\/\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\/blog\/wp-content\/uploads\/2025\/05\/30125822\/ChatGPT-Image-May-30-2025-06_26_47-PM-768x512.jpg 768w, https:\/\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\/blog\/wp-content\/uploads\/2025\/05\/30125822\/ChatGPT-Image-May-30-2025-06_26_47-PM.jpg 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In this blog, I&#8217;m taking you back to my early Node.js days. I had this small app that simply displayed a list of users from a JSON file. The controller was neat and tidy\u2014reading the file, filtering data, and handling basic sorting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But as the project grew, so did the requirements. Suddenly, I needed to filter by age, sort by name, and add a search feature. What was once clean code turned into a tangled mess of logic. Debugging became a challenge, testing was a headache, and reusing any part of that controller felt impossible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This experience taught me a valuable lesson in code organization, leading me to separate business logic from controllers\u2014a game changer for maintainability. Today, I&#8217;ll show you why that change mattered and how to make it happen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Scene 1: The Messy Controller<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cLet&#8217;s see what that initial controller might have looked like, all in one place.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/\/ controllers\/userController.js (Before Refactoring)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const fs = require(&#8216;fs&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const path = require(&#8216;path&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const getUsers = (req, res) =&gt; {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;\/\/ Reading from a JSON file (our simple &#8220;database&#8221;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;const filePath = path.join(__dirname, &#8216;..\/data\/users.json&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;const data = fs.readFileSync(filePath, &#8216;utf-8&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;let users = JSON.parse(data);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;\/\/ Suppose we have a query to filter users by age<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;if (req.query.age) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;users = users.filter(user =&gt; user.age === parseInt(req.query.age));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;\/\/ And another query to sort users by their username alphabetically<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;if (req.query.sortBy === &#8216;username&#8217;) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;users.sort((a, b) =&gt; a.username.localeCompare(b.username));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;\/\/ Send back the list of users<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;res.json(users);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">};<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">module.exports = { getUsers };<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cIn this controller, you see everything is happening here: reading data, filtering, sorting, and returning the response. As the app grows, imagine adding more functionality (like pagination, additional filters, etc.) to this same controller\u2014 things can quickly turn messy.\u201d<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Scene 2: What\u2019s the Problem?<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cHaving all this logic in the controller means:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Harder to Test:<\/strong> You can\u2019t easily test the logic for filtering or sorting without making an HTTP request.<br><\/li>\n\n\n\n<li><strong>Less Reusable:<\/strong> If you need similar logic elsewhere, you\u2019d have to copy this code.<br><\/li>\n\n\n\n<li><strong>Cluttered Code:<\/strong> The controller should simply connect HTTP requests to functions that perform specific business logic, not handle all the operations directly.\u201d<br><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Scene 3: Enter the Service<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cTo solve this, I decided to extract the filtering and sorting logic into its own file\u2014a service. By doing so, the controller becomes focused only on handling the request and sending the response, while the service takes care of processing the data.\u201d<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Creating the Service File<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\/\/ services\/userService.js<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const fs = require(&#8216;fs&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const path = require(&#8216;path&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const filePath = path.join(__dirname, &#8216;..\/data\/users.json&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const getAllUsers = () =&gt; {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;const data = fs.readFileSync(filePath, &#8216;utf-8&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;return JSON.parse(data);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">};<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const filterAndSortUsers = (users, query) =&gt; {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;\/\/ Filtering logic (e.g., by age)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;if (query.age) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;users = users.filter(user =&gt; user.age === parseInt(query.age));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;\/\/ Sorting logic (e.g., by username)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;if (query.sortBy === &#8216;username&#8217;) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;users.sort((a, b) =&gt; a.username.localeCompare(b.username));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;return users;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">};<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">module.exports = {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;getAllUsers,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;filterAndSortUsers<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">};<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cIn our userService.js file, we have two functions:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>getAllUsers() reads and parses the JSON file.<br><\/li>\n\n\n\n<li>filterAndSortUsers() applies filtering and sorting based on the query parameters.<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This separation means we can now test and modify our business logic independently from our HTTP handling.\u201d<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Scene 4: A Clean Controller<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cWith the logic extracted, our controller is now simpler and easier to understand.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/\/ controllers\/userController.js (After Refactoring)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const userService = require(&#8216;..\/services\/userService&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const getUsers = (req, res) =&gt; {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;\/\/ Get the full list of users from our service<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;let users = userService.getAllUsers();<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;\/\/ Use the service to apply filtering and sorting based on the query parameters<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;users = userService.filterAndSortUsers(users, req.query);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;\/\/ Send back the filtered and sorted list of users<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;res.json(users);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">};<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">module.exports = { getUsers };<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cNotice how the controller now only focuses on:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Receiving the HTTP request<br><\/li>\n\n\n\n<li>Delegating work to the service<br><\/li>\n\n\n\n<li>Sending back the HTTP response<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This separation of concerns makes your code cleaner, more testable, and more maintainable.\u201d<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wrapping Up the Story<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cSo, to recap:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>The Problem:<\/strong> A controller loaded with business logic (reading, filtering, sorting) gets cluttered and hard to maintain.<br><\/li>\n\n\n\n<li><strong>The Service:<\/strong> We move that logic into its own file, where it can be reused, easily tested, and managed independently.<br><\/li>\n\n\n\n<li><strong>The Clean Controller:<\/strong> Now the controller just coordinates the request and response while the service does the heavy lifting.<br><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This approach is a stepping stone toward writing cleaner and more modular Node.js applications, even with basic projects.\u201d<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Conclusion <\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cToday, we\u2019ve looked at how splitting the business logic from the controller into a service can make your code simpler and more scalable. In future lessons, we can build on this by introducing asynchronous operations and a real database.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Feel free to ask if you need any further details or a deeper dive into any of these concepts!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this blog, I&#8217;m taking you back to my early Node.js days. I had this small app that simply displayed a list of users from a JSON file. The controller&hellip;<\/p>\n","protected":false},"author":6,"featured_media":1484,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[],"class_list":["post-1483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tips"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Services in NodeJS - Sharpener Tech<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Services in NodeJS - Sharpener Tech\" \/>\n<meta property=\"og:description\" content=\"In this blog, I&#8217;m taking you back to my early Node.js days. I had this small app that simply displayed a list of users from a JSON file. The controller&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/\" \/>\n<meta property=\"og:site_name\" content=\"Sharpener Tech\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-30T13:15:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-02T11:01:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\/blog\/wp-content\/uploads\/2025\/05\/30125822\/ChatGPT-Image-May-30-2025-06_26_47-PM.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Julian Toppo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Julian Toppo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/\"},\"author\":{\"name\":\"Julian Toppo\",\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/#\\\/schema\\\/person\\\/eb9482df421e52d30f961eae8a0fd67a\"},\"headline\":\"Services in NodeJS\",\"datePublished\":\"2025-05-30T13:15:46+00:00\",\"dateModified\":\"2025-06-02T11:01:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/\"},\"wordCount\":879,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/30125822\\\/ChatGPT-Image-May-30-2025-06_26_47-PM.jpg\",\"articleSection\":[\"Tips\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/\",\"url\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/\",\"name\":\"Services in NodeJS - Sharpener Tech\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/30125822\\\/ChatGPT-Image-May-30-2025-06_26_47-PM.jpg\",\"datePublished\":\"2025-05-30T13:15:46+00:00\",\"dateModified\":\"2025-06-02T11:01:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/#primaryimage\",\"url\":\"https:\\\/\\\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/30125822\\\/ChatGPT-Image-May-30-2025-06_26_47-PM.jpg\",\"contentUrl\":\"https:\\\/\\\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/30125822\\\/ChatGPT-Image-May-30-2025-06_26_47-PM.jpg\",\"width\":1536,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/services-in-nodejs\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Services in NodeJS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/\",\"name\":\"Sharpener Tech\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/#organization\",\"name\":\"Sharpener Tech\",\"url\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/wordpress-prod.sharpener.tech\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Sharpener_logo-removebg-preview.png\",\"contentUrl\":\"https:\\\/\\\/wordpress-prod.sharpener.tech\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Sharpener_logo-removebg-preview.png\",\"width\":187,\"height\":62,\"caption\":\"Sharpener Tech\"},\"image\":{\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/#\\\/schema\\\/person\\\/eb9482df421e52d30f961eae8a0fd67a\",\"name\":\"Julian Toppo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/87799fed7134aa3bb27606b4eceeb577117023517d38b0152340c9e59376052c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/87799fed7134aa3bb27606b4eceeb577117023517d38b0152340c9e59376052c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/87799fed7134aa3bb27606b4eceeb577117023517d38b0152340c9e59376052c?s=96&d=mm&r=g\",\"caption\":\"Julian Toppo\"},\"url\":\"https:\\\/\\\/www.sharpener.tech\\\/blog\\\/author\\\/julian\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Services in NodeJS - Sharpener Tech","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/","og_locale":"en_US","og_type":"article","og_title":"Services in NodeJS - Sharpener Tech","og_description":"In this blog, I&#8217;m taking you back to my early Node.js days. I had this small app that simply displayed a list of users from a JSON file. The controller&hellip;","og_url":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/","og_site_name":"Sharpener Tech","article_published_time":"2025-05-30T13:15:46+00:00","article_modified_time":"2025-06-02T11:01:41+00:00","og_image":[{"width":1536,"height":1024,"url":"https:\/\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\/blog\/wp-content\/uploads\/2025\/05\/30125822\/ChatGPT-Image-May-30-2025-06_26_47-PM.jpg","type":"image\/jpeg"}],"author":"Julian Toppo","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Julian Toppo","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/#article","isPartOf":{"@id":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/"},"author":{"name":"Julian Toppo","@id":"https:\/\/www.sharpener.tech\/blog\/#\/schema\/person\/eb9482df421e52d30f961eae8a0fd67a"},"headline":"Services in NodeJS","datePublished":"2025-05-30T13:15:46+00:00","dateModified":"2025-06-02T11:01:41+00:00","mainEntityOfPage":{"@id":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/"},"wordCount":879,"commentCount":0,"publisher":{"@id":"https:\/\/www.sharpener.tech\/blog\/#organization"},"image":{"@id":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/#primaryimage"},"thumbnailUrl":"https:\/\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\/blog\/wp-content\/uploads\/2025\/05\/30125822\/ChatGPT-Image-May-30-2025-06_26_47-PM.jpg","articleSection":["Tips"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/","url":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/","name":"Services in NodeJS - Sharpener Tech","isPartOf":{"@id":"https:\/\/www.sharpener.tech\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/#primaryimage"},"image":{"@id":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/#primaryimage"},"thumbnailUrl":"https:\/\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\/blog\/wp-content\/uploads\/2025\/05\/30125822\/ChatGPT-Image-May-30-2025-06_26_47-PM.jpg","datePublished":"2025-05-30T13:15:46+00:00","dateModified":"2025-06-02T11:01:41+00:00","breadcrumb":{"@id":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/#primaryimage","url":"https:\/\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\/blog\/wp-content\/uploads\/2025\/05\/30125822\/ChatGPT-Image-May-30-2025-06_26_47-PM.jpg","contentUrl":"https:\/\/sharpener-wordpress.s3.ap-south-1.amazonaws.com\/blog\/wp-content\/uploads\/2025\/05\/30125822\/ChatGPT-Image-May-30-2025-06_26_47-PM.jpg","width":1536,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/www.sharpener.tech\/blog\/services-in-nodejs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sharpener.tech\/blog\/"},{"@type":"ListItem","position":2,"name":"Services in NodeJS"}]},{"@type":"WebSite","@id":"https:\/\/www.sharpener.tech\/blog\/#website","url":"https:\/\/www.sharpener.tech\/blog\/","name":"Sharpener Tech","description":"","publisher":{"@id":"https:\/\/www.sharpener.tech\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sharpener.tech\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.sharpener.tech\/blog\/#organization","name":"Sharpener Tech","url":"https:\/\/www.sharpener.tech\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sharpener.tech\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/wordpress-prod.sharpener.tech\/wp-content\/uploads\/2026\/05\/Sharpener_logo-removebg-preview.png","contentUrl":"https:\/\/wordpress-prod.sharpener.tech\/wp-content\/uploads\/2026\/05\/Sharpener_logo-removebg-preview.png","width":187,"height":62,"caption":"Sharpener Tech"},"image":{"@id":"https:\/\/www.sharpener.tech\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.sharpener.tech\/blog\/#\/schema\/person\/eb9482df421e52d30f961eae8a0fd67a","name":"Julian Toppo","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/87799fed7134aa3bb27606b4eceeb577117023517d38b0152340c9e59376052c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/87799fed7134aa3bb27606b4eceeb577117023517d38b0152340c9e59376052c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/87799fed7134aa3bb27606b4eceeb577117023517d38b0152340c9e59376052c?s=96&d=mm&r=g","caption":"Julian Toppo"},"url":"https:\/\/www.sharpener.tech\/blog\/author\/julian\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sharpener.tech\/blog\/wp-json\/wp\/v2\/posts\/1483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sharpener.tech\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sharpener.tech\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sharpener.tech\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sharpener.tech\/blog\/wp-json\/wp\/v2\/comments?post=1483"}],"version-history":[{"count":2,"href":"https:\/\/www.sharpener.tech\/blog\/wp-json\/wp\/v2\/posts\/1483\/revisions"}],"predecessor-version":[{"id":1525,"href":"https:\/\/www.sharpener.tech\/blog\/wp-json\/wp\/v2\/posts\/1483\/revisions\/1525"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sharpener.tech\/blog\/wp-json\/wp\/v2\/media\/1484"}],"wp:attachment":[{"href":"https:\/\/www.sharpener.tech\/blog\/wp-json\/wp\/v2\/media?parent=1483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sharpener.tech\/blog\/wp-json\/wp\/v2\/categories?post=1483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sharpener.tech\/blog\/wp-json\/wp\/v2\/tags?post=1483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}