<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shyam Tala</title>
    <description>The latest articles on DEV Community by Shyam Tala (@shyamtala).</description>
    <link>https://dev.to/shyamtala</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F972738%2F54058f9e-69f8-4b9b-90fb-c4e097ff1f2f.jpeg</url>
      <title>DEV Community: Shyam Tala</title>
      <link>https://dev.to/shyamtala</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shyamtala"/>
    <language>en</language>
    <item>
      <title>How I Accidentally Deleted My Project Environments and Used VS Code’s Timeline to Save the Day</title>
      <dc:creator>Shyam Tala</dc:creator>
      <pubDate>Thu, 20 Mar 2025 05:28:37 +0000</pubDate>
      <link>https://dev.to/shyamtala/how-i-accidentally-deleted-my-project-environments-and-used-vs-codes-timeline-to-save-the-day-539f</link>
      <guid>https://dev.to/shyamtala/how-i-accidentally-deleted-my-project-environments-and-used-vs-codes-timeline-to-save-the-day-539f</guid>
      <description>&lt;p&gt;Yesterday, in a moment of sheer genius (read: foolishness), I accidentally deleted my project’s .env file. No big deal, right? Just check the bin folder and restore it. Except… it wasn’t there. My .env had vanished into the void.&lt;/p&gt;

&lt;p&gt;Cue panic mode. 😱 &lt;/p&gt;

&lt;h3&gt;
  
  
  The Panic: Googling My Way to Nowhere
&lt;/h3&gt;

&lt;p&gt;I did what any developer would do: I Googled. I read blogs, Stack Overflow threads, and even watched a few YouTube tutorials. But nothing worked. My environments were lost in the digital abyss, and I was starting to accept my fate.  &lt;/p&gt;

&lt;p&gt;Then, like a glimmer of hope, I remembered something: &lt;strong&gt;VS Code’s Timeline feature&lt;/strong&gt;.  &lt;/p&gt;

&lt;h3&gt;
  
  
  The Savior: VS Code’s Timeline
&lt;/h3&gt;

&lt;p&gt;For those who don’t know, VS Code’s Timeline is like a time machine for your files. It shows you the history of changes, and you can restore previous versions with a single click. I opened the Timeline, scrolled through the history, and there they were—my precious environments, waiting to be resurrected.  &lt;/p&gt;

&lt;p&gt;I clicked “Restore,” and just like that, my environments were back. Crisis averted.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4n85rlsdm1d29bi2ij9l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4n85rlsdm1d29bi2ij9l.png" alt="vscode timeline" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons Learned (The Easy Way):
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backup Everything&lt;/strong&gt;: This incident taught me the importance of backups. Whether it’s a simple copy-paste or an automated system, always have a backup plan.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VS Code Timeline is a Game-Changer&lt;/strong&gt;: If you’re not using this feature, you’re missing out. It’s like having an undo button for your entire project.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Think Twice, Delete Once&lt;/strong&gt;: That delete button is dangerous. Always double-check before you hit it.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stay Calm and Google On&lt;/strong&gt;: When things go wrong, take a deep breath and start searching for solutions. The answer might be closer than you think.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Next time you delete something important, don’t lose hope. Your savior might be just a few clicks away. And with that, I close this chapter of The Lost &amp;amp; Found Dev Files Saga.&lt;/p&gt;

&lt;p&gt;Stay safe, and may your .env files always be recoverable! 🚀&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>backup</category>
      <category>vscode</category>
      <category>developertips</category>
    </item>
    <item>
      <title>How to Manage Multiple GitHub Accounts on macOS (Like an IT Moonlighter) 🌙💻</title>
      <dc:creator>Shyam Tala</dc:creator>
      <pubDate>Mon, 17 Mar 2025 05:51:46 +0000</pubDate>
      <link>https://dev.to/shyamtala/how-to-manage-multiple-github-accounts-on-macos-like-an-it-moonlighter-all</link>
      <guid>https://dev.to/shyamtala/how-to-manage-multiple-github-accounts-on-macos-like-an-it-moonlighter-all</guid>
      <description>&lt;h2&gt;
  
  
  Juggling Work and Side Projects Without GitHub Drama
&lt;/h2&gt;

&lt;p&gt;So, you’re living the double life—full-time dev by day, side-hustle coding wizard by night. Managing multiple GitHub accounts can feel like having two secret identities. If you’ve ever accidentally committed work code with your personal account or vice versa, you know the pain. 😅&lt;/p&gt;

&lt;p&gt;But don’t worry! With SSH keys and a little Git magic, you can seamlessly switch between accounts like a pro. Let’s set things up!&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Generate SSH Keys for Each GitHub Account 🔑
&lt;/h2&gt;

&lt;p&gt;Think of SSH keys as the ID badges for your GitHub accounts. You need separate badges for work and personal projects.&lt;/p&gt;

&lt;p&gt;Open your terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Personal GitHub account&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"personal@email.com"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/personal

&lt;span class="c"&gt;# Work GitHub account&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"work@email.com"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What’s Happening Here?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t ed25519&lt;/code&gt;: Uses a secure encryption type (your digital badge).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-C "email"&lt;/code&gt;: Tags the key with your email.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-f ~/.ssh/filename&lt;/code&gt;: Saves the keys separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Congrats! You now have two sets of SSH keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;~/.ssh/personal&lt;/code&gt; (for personal repos)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/.ssh/work&lt;/code&gt; (for work repos)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Configure SSH to Know Who’s Who 🎭
&lt;/h2&gt;

&lt;p&gt;Now, let’s teach SSH when to use which key. Open the SSH config file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano ~/.ssh/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Personal GitHub account&lt;/span&gt;
Host github.com-personal
    HostName github.com
    User git
    IdentityFile ~/.ssh/personal

&lt;span class="c"&gt;# Work GitHub account&lt;/span&gt;
Host github.com-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Breakdown:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Host&lt;/code&gt;: Custom alias (makes switching easy).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IdentityFile&lt;/code&gt;: Tells SSH which key to use.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HostName&lt;/code&gt;: Points to GitHub.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Save the file (Ctrl + O, Enter, then Ctrl + X) and update permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now SSH knows when to wear the "personal" badge and when to wear the "work" badge. ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Add Your SSH Keys to GitHub 🔗
&lt;/h2&gt;

&lt;p&gt;You need to introduce these SSH keys to GitHub (so it lets you in).&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/personal.pub  &lt;span class="c"&gt;# Copy this key for personal GitHub&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/work.pub      &lt;span class="c"&gt;# Copy this key for work GitHub&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go to &lt;strong&gt;GitHub &amp;gt; Settings &amp;gt; SSH and GPG keys&lt;/strong&gt; → Click &lt;strong&gt;New SSH key&lt;/strong&gt;, paste it in, and save.&lt;/p&gt;

&lt;p&gt;Repeat for both accounts. Now GitHub knows who you are! 🎉&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Test Your SSH Connection 🛠️
&lt;/h2&gt;

&lt;p&gt;Let’s confirm everything is working:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-T&lt;/span&gt; git@github.com-personal
ssh &lt;span class="nt"&gt;-T&lt;/span&gt; git@github.com-work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see &lt;strong&gt;"Hi username! You’ve successfully authenticated"&lt;/strong&gt;, you’re good to go!&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Set Up Git to Use the Right Account 📝
&lt;/h2&gt;

&lt;p&gt;Now, let’s make sure Git commits are using the correct account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Edit Your Global Git Config
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano ~/.gitconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[includeIf "gitdir:~/personal/"]&lt;/span&gt;
    &lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;~/.gitconfig-personal&lt;/span&gt;

&lt;span class="nn"&gt;[includeIf "gitdir:~/work/"]&lt;/span&gt;
    &lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;~/.gitconfig-work&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Git to use different configs based on the project folder.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create Account-Specific Configs
&lt;/h3&gt;

&lt;p&gt;For &lt;strong&gt;personal&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"[user]&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    name = Your Personal Name&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    email = personal@email.com"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.gitconfig-personal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For &lt;strong&gt;work&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"[user]&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    name = Your Work Name&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    email = work@email.com"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.gitconfig-work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, when you’re in &lt;code&gt;~/personal/&lt;/code&gt;, Git uses &lt;code&gt;personal@email.com&lt;/code&gt;, and in &lt;code&gt;~/work/&lt;/code&gt;, it switches to &lt;code&gt;work@email.com&lt;/code&gt;. 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Cloning and Pushing Without Headaches 🔄
&lt;/h2&gt;

&lt;p&gt;Always use the right SSH alias when cloning repositories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Personal repos&lt;/span&gt;
git clone git@github.com-personal:username/repo.git

&lt;span class="c"&gt;# Work repos&lt;/span&gt;
git clone git@github.com-work:username/repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Already cloned the repo? Update the remote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote set-url origin git@github.com-personal:username/repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you’ll never push personal code to work or vice versa by mistake. 😎&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Apply Configuration Locally
&lt;/h2&gt;

&lt;p&gt;To apply the configuration for a specific repository, you can use the following command inside the project directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--local&lt;/span&gt; include.path ~/.gitconfig-personal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Troubleshooting Common Issues 🛑
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SSH Connection Fails? ❌
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-add ~/.ssh/personal
ssh-add ~/.ssh/work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test again: &lt;code&gt;ssh -T git@github.com-personal&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Git Using the Wrong Email? 🤦‍♂️
&lt;/h3&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config user.email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config user.email &lt;span class="s2"&gt;"correct@email.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your commits will always be tied to the right account.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion 🎉
&lt;/h2&gt;

&lt;p&gt;That’s it! Now you can switch between GitHub accounts effortlessly—just like balancing your 9-to-5 and your moonlight coding gigs. 🌙💼&lt;/p&gt;

&lt;p&gt;No more “oops, wrong account” commits. Just smooth sailing between personal and work projects. Happy coding! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>git</category>
      <category>github</category>
      <category>programming</category>
    </item>
    <item>
      <title>JavaScript Closures Explained with a Crazy Grandfather’s Treasure 🏴‍☠️💰</title>
      <dc:creator>Shyam Tala</dc:creator>
      <pubDate>Mon, 17 Mar 2025 05:15:23 +0000</pubDate>
      <link>https://dev.to/shyamtala/javascript-closures-explained-with-a-crazy-grandfathers-treasure-2ae3</link>
      <guid>https://dev.to/shyamtala/javascript-closures-explained-with-a-crazy-grandfathers-treasure-2ae3</guid>
      <description>&lt;p&gt;Imagine you have a &lt;strong&gt;crazy rich grandfather&lt;/strong&gt; (let's call him &lt;strong&gt;Grandpa Closure&lt;/strong&gt;) who is very protective of his treasure. 💎  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Grandpa’s Rule:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;“You can &lt;strong&gt;see the treasure&lt;/strong&gt;, you can &lt;strong&gt;use the treasure&lt;/strong&gt;, but you can’t &lt;strong&gt;steal the key&lt;/strong&gt; to my vault!” 😤  &lt;/p&gt;

&lt;p&gt;So, he &lt;strong&gt;locks up&lt;/strong&gt; his wealth in a secret underground vault and &lt;strong&gt;only gives you a helper&lt;/strong&gt; (a butler named &lt;code&gt;getTreasure()&lt;/code&gt;) to access it.  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;JavaScript Version of Grandpa Closure’s Vault&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GrandpaClosure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;treasure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;💰 100kg of Gold &amp;amp; a Flying Car 🚗✨&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Secret wealth&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getTreasure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Here’s your inheritance: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;treasure&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// You (the grandchild) get access to the treasure through the butler&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;grandchild&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GrandpaClosure&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;grandchild&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// Here’s your inheritance: 💰 100kg of Gold &amp;amp; a Flying Car 🚗✨&lt;/span&gt;

&lt;span class="c1"&gt;// But you can’t directly access Grandpa's vault!&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;grandchild&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;treasure&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Undefined 😭&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;treasure&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Undefined 😵&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;What Just Happened?&lt;/strong&gt; 🤯
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;GrandpaClosure() runs&lt;/strong&gt; and creates the &lt;strong&gt;secret treasure (variable)&lt;/strong&gt; inside it.
&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;returns a function (&lt;code&gt;getTreasure&lt;/code&gt;)&lt;/strong&gt;, which acts like a butler that &lt;strong&gt;remembers&lt;/strong&gt; where the vault is.
&lt;/li&gt;
&lt;li&gt;Even though &lt;code&gt;GrandpaClosure()&lt;/code&gt; is &lt;strong&gt;finished&lt;/strong&gt;, the &lt;code&gt;getTreasure()&lt;/code&gt; function &lt;strong&gt;still remembers the treasure&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;But you &lt;strong&gt;can’t directly access&lt;/strong&gt; &lt;code&gt;treasure&lt;/code&gt; because it’s locked inside the function scope.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;That’s Closure! 🎉&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The butler (&lt;code&gt;getTreasure()&lt;/code&gt;) &lt;strong&gt;remembers the treasure&lt;/strong&gt; but &lt;strong&gt;doesn’t give you the vault key!&lt;/strong&gt;  &lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;Can I Ask Grandpa to Add More Gold?&lt;/strong&gt; 🧐
&lt;/h3&gt;

&lt;p&gt;Nope! He &lt;strong&gt;doesn’t trust you that much!&lt;/strong&gt; 😂 You only get &lt;strong&gt;read access&lt;/strong&gt;, but let’s say Grandpa decides:  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Okay, you can add more to the treasure, but only through a secret code!"&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;Now, we modify the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GrandpaClosure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;treasure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;💰 100kg of Gold &amp;amp; a Flying Car 🚗✨&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;getTreasure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Here’s your inheritance: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;treasure&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;addGold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;treasure&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;` + &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; Gold`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Gold added! New total: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;treasure&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// You get access to the butler’s functions, not the vault!&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;grandchild&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GrandpaClosure&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;grandchild&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTreasure&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// Here’s your inheritance: 💰 100kg of Gold &amp;amp; a Flying Car 🚗✨&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;grandchild&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addGold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;50kg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Gold added! New total: 💰 100kg of Gold &amp;amp; a Flying Car 🚗✨ + 50kg Gold&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;grandchild&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTreasure&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// Here’s your inheritance: 💰 100kg of Gold &amp;amp; a Flying Car 🚗✨ + 50kg Gold&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Moral of the Story?&lt;/strong&gt; 🤓
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Closures are like Grandpa’s Secret Vault&lt;/strong&gt; – Some things remain &lt;strong&gt;private&lt;/strong&gt; but can still be &lt;strong&gt;accessed indirectly&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can retrieve treasure, but you can’t steal it!&lt;/strong&gt; – You get access to &lt;strong&gt;functions that remember the variables&lt;/strong&gt;, but you &lt;strong&gt;can’t directly change them&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closures help protect your JavaScript code&lt;/strong&gt; – Just like Grandpa &lt;strong&gt;protects his wealth from greedy grandkids&lt;/strong&gt;! 😂
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Final Thought&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next time someone asks you what a closure is, just tell them:  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;"It’s like having a Grandpa who hides all his money in a secret vault, only lets you take a peek through a butler, and won’t let you touch the key!"&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;That’s closures in JavaScript! 🎩💰💎🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>closure</category>
    </item>
    <item>
      <title>🚀 Introducing rate-bouncer: A Powerful Rate Limiting Middleware for Node.js</title>
      <dc:creator>Shyam Tala</dc:creator>
      <pubDate>Tue, 11 Mar 2025 12:45:25 +0000</pubDate>
      <link>https://dev.to/shyamtala/introducing-rate-bouncer-a-powerful-rate-limiting-middleware-for-nodejs-1np2</link>
      <guid>https://dev.to/shyamtala/introducing-rate-bouncer-a-powerful-rate-limiting-middleware-for-nodejs-1np2</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In today's fast-paced digital world, APIs are the backbone of web applications, enabling seamless data exchange. However, APIs are vulnerable to abuse, such as Denial-of-Service (DoS) attacks, excessive bot traffic, and accidental request floods. To combat these challenges, rate limiting is essential. This is where &lt;code&gt;rate-bouncer&lt;/code&gt; comes into play! 🎯&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rate-bouncer&lt;/code&gt; is a lightweight and flexible rate-limiting middleware for Node.js, designed to protect your API from excessive requests while ensuring legitimate users have a smooth experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use &lt;code&gt;rate-bouncer&lt;/code&gt;? 🤔
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Prevents API Abuse&lt;/strong&gt;: Stops malicious bots and excessive traffic from overwhelming your server.&lt;br&gt;
✅ &lt;strong&gt;Customizable&lt;/strong&gt;: Offers global and per-route configurations, allowing fine-tuned control.&lt;br&gt;
✅ &lt;strong&gt;Lightweight &amp;amp; Fast&lt;/strong&gt;: Minimal footprint with in-memory storage for quick lookups.&lt;br&gt;
✅ &lt;strong&gt;Easy Integration&lt;/strong&gt;: Works effortlessly with Express and similar frameworks.&lt;br&gt;
✅ &lt;strong&gt;Automatic Cleanup&lt;/strong&gt;: Optimizes memory usage by periodically removing old request data.&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started 🚀
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;You can install &lt;code&gt;rate-bouncer&lt;/code&gt; using npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;rate-bouncer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Basic Usage
&lt;/h3&gt;

&lt;p&gt;Setting up &lt;code&gt;rate-bouncer&lt;/code&gt; in an Express app is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;setGlobalRateLimitConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rateLimitConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rate-bouncer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Set global rate limit (applies to all routes unless overridden)&lt;/span&gt;
&lt;span class="nf"&gt;setGlobalRateLimitConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 15 minutes&lt;/span&gt;
  &lt;span class="na"&gt;maxRequests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Max 100 requests per 15 minutes&lt;/span&gt;
  &lt;span class="na"&gt;startCleanupInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Cleanup interval (optional)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Apply rate limiter globally&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rateLimitConfig&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This route is protected by rate limiting.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server running on port 3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Advanced Configuration ⚙️
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Per-Route Customization
&lt;/h3&gt;

&lt;p&gt;Override global settings for specific routes when needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/special&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;rateLimitConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxRequests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Limited to 50 requests per 10 minutes.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Disabling Rate Limiting
&lt;/h3&gt;

&lt;p&gt;Need to exclude certain routes? Simply disable rate limiting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/open&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;rateLimitConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This route has no rate limit.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Handling Exceeded Limits ⚠️
&lt;/h3&gt;

&lt;p&gt;When a user exceeds the allowed request count, they receive a &lt;code&gt;429 Too Many Requests&lt;/code&gt; response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Too many requests"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"retryAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.0 seconds"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Best Practices for Using &lt;code&gt;rate-bouncer&lt;/code&gt; 🔥
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Choose the Right Limits&lt;/strong&gt;: Set appropriate request limits based on your API's needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Different Limits for Different Routes&lt;/strong&gt;: Critical routes may need stricter limits than public endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combine with Authentication&lt;/strong&gt;: Rate limiting works best when combined with authentication and IP-based restrictions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor Traffic&lt;/strong&gt;: Regularly check logs to fine-tune rate limits based on real-world usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion 🎯
&lt;/h2&gt;

&lt;p&gt;Rate limiting is a crucial defense against API abuse and traffic overloads. &lt;code&gt;rate-bouncer&lt;/code&gt; makes it incredibly easy to implement rate limiting in Node.js applications with minimal setup and maximum flexibility. By integrating this lightweight middleware, you can protect your API, enhance security, and provide a smooth user experience.&lt;/p&gt;

&lt;p&gt;Give &lt;code&gt;rate-bouncer&lt;/code&gt; a try today! 🚀&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Check it out on GitHub:&lt;/strong&gt; &lt;a href="https://github.com/shyamtala003/rate-bouncer" rel="noopener noreferrer"&gt;rate-bouncer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding! 💻🔥&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Global Error Handling in Express.js: Best Practices</title>
      <dc:creator>Shyam Tala</dc:creator>
      <pubDate>Mon, 10 Mar 2025 07:07:16 +0000</pubDate>
      <link>https://dev.to/shyamtala/global-error-handling-in-expressjs-best-practices-4957</link>
      <guid>https://dev.to/shyamtala/global-error-handling-in-expressjs-best-practices-4957</guid>
      <description>&lt;p&gt;Error handling is a crucial part of any backend application. In &lt;strong&gt;Express.js&lt;/strong&gt;, an error can occur due to various reasons such as invalid user input, database failures, or unexpected issues in the application logic. To ensure a smooth user experience and maintainability, implementing a &lt;strong&gt;global error handler&lt;/strong&gt; is essential.&lt;/p&gt;

&lt;p&gt;In this blog, we will explore &lt;strong&gt;what a global error handler is, how to implement it in Express.js, and best practices to follow&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 What is Global Error Handling in Express.js?
&lt;/h2&gt;

&lt;p&gt;In Express.js, middleware functions are executed in a sequence, and errors can propagate through them. A &lt;strong&gt;global error handler&lt;/strong&gt; is a special middleware function that:&lt;/p&gt;

&lt;p&gt;✅ Catches errors from any part of the application.&lt;br&gt;&lt;br&gt;
✅ Prevents the app from crashing due to unhandled errors.&lt;br&gt;&lt;br&gt;
✅ Provides consistent error responses.&lt;br&gt;&lt;br&gt;
✅ Helps in debugging and logging.&lt;/p&gt;

&lt;p&gt;By defining a &lt;strong&gt;centralized error handler&lt;/strong&gt;, we can manage all application errors in one place.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠 How to Implement a Global Error Handler in Express.js
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: &lt;strong&gt;Basic Express App Setup&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;First, create a basic Express server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Middleware to parse JSON&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// Sample Route&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Something went wrong!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Start the server&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server running on port 3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this stage, if an error occurs in a route, Express will return a default &lt;strong&gt;HTML error response&lt;/strong&gt;. We need a &lt;strong&gt;custom global error handler&lt;/strong&gt; to return structured JSON responses.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: &lt;strong&gt;Define a Global Error Handler Middleware&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;An error-handling middleware &lt;strong&gt;must have four parameters&lt;/strong&gt;: &lt;code&gt;(err, req, res, next)&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Global Error Handling Middleware&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Log the error&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Internal Server Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Important:&lt;/strong&gt; The global error handler &lt;strong&gt;must be defined after all routes&lt;/strong&gt;; otherwise, it won’t work.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Throwing and Handling Errors in Express.js
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ &lt;strong&gt;Synchronous Errors&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Simply throwing an error inside a route will be caught by the error handler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/sync-error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Synchronous error occurred!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2️⃣ &lt;strong&gt;Asynchronous Errors&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For async functions, always pass the error to &lt;code&gt;next(err)&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/async-error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;someAsyncOperation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Pass the error to the global handler&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Enhancing the Global Error Handler
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Handling Different Error Types
&lt;/h3&gt;

&lt;p&gt;You can customize responses based on error types:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Internal Server Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ValidationError&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid data provided&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating a Custom Error Class
&lt;/h3&gt;

&lt;p&gt;To make error handling even cleaner, define a &lt;strong&gt;custom error class&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppError&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can throw errors like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/custom-error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AppError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Resource not found&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modify the error handler to handle this class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚡ Using &lt;code&gt;express-async-errors&lt;/code&gt; for Cleaner Async Error Handling
&lt;/h2&gt;

&lt;p&gt;Instead of manually wrapping async functions in try-catch, install &lt;code&gt;express-async-errors&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express-async-errors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import it in your &lt;code&gt;server.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express-async-errors&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, async errors will automatically be passed to the global handler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/async-error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;someAsyncOperation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// No try-catch needed&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚨 Common Mistakes to Avoid
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Defining the Error Handler Before Routes&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Error handlers &lt;strong&gt;must&lt;/strong&gt; be defined &lt;strong&gt;after&lt;/strong&gt; all routes.&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Wrong Order:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* Error Handler */&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// ❌&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Test Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Correct Order:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Test Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* Error Handler */&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// ✅&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Not Logging Errors for Debugging&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Always log errors for debugging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Not Handling Different Error Types&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Handle validation errors separately for better responses.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Best Practices for Global Error Handling
&lt;/h2&gt;

&lt;p&gt;✅ Keep the error handler &lt;strong&gt;at the bottom&lt;/strong&gt; of the middleware stack.&lt;br&gt;&lt;br&gt;
✅ Use a &lt;strong&gt;custom error class&lt;/strong&gt; for cleaner error handling.&lt;br&gt;&lt;br&gt;
✅ Log errors to a file or a monitoring service (e.g., &lt;strong&gt;Winston, Sentry&lt;/strong&gt;).&lt;br&gt;&lt;br&gt;
✅ Handle &lt;strong&gt;validation errors&lt;/strong&gt; differently from server errors.&lt;br&gt;&lt;br&gt;
✅ Use &lt;code&gt;express-async-errors&lt;/code&gt; to &lt;strong&gt;avoid repetitive try-catch blocks&lt;/strong&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🎉 Conclusion
&lt;/h2&gt;

&lt;p&gt;A well-implemented &lt;strong&gt;global error handler&lt;/strong&gt; in Express.js ensures that your application is robust, maintains a good user experience, and makes debugging easier. By following best practices, handling different error types, and using custom error classes, you can create a &lt;strong&gt;clean and maintainable&lt;/strong&gt; error-handling mechanism.&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Now you’re ready to handle errors like a pro in your Express.js apps! 🚀&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>express</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>🚀 Introducing Git Styler: Make Your Git Commits Cleaner and Faster!</title>
      <dc:creator>Shyam Tala</dc:creator>
      <pubDate>Fri, 07 Mar 2025 11:49:46 +0000</pubDate>
      <link>https://dev.to/shyamtala/introducing-git-styler-make-your-git-commits-cleaner-and-faster-311e</link>
      <guid>https://dev.to/shyamtala/introducing-git-styler-make-your-git-commits-cleaner-and-faster-311e</guid>
      <description>&lt;p&gt;&lt;strong&gt;Tired of messy commit messages?&lt;/strong&gt; Keeping a clean Git history is crucial for collaboration, but writing well-structured commit messages every time can be a hassle. Enter &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/git-styler" rel="noopener noreferrer"&gt;Git Styler&lt;/a&gt;&lt;/strong&gt; – a CLI tool that simplifies commit message styling and enforces structure effortlessly. 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Git Styler? 🤔
&lt;/h2&gt;

&lt;p&gt;Writing commit messages manually can lead to inconsistencies like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unclear or unformatted commit messages&lt;/li&gt;
&lt;li&gt;Inconsistent use of emojis or prefixes&lt;/li&gt;
&lt;li&gt;No standard format for different types of commits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Git Styler solves this&lt;/strong&gt; by providing easy-to-use commands for well-structured commits, following conventional commit formats.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 Features
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Predefined commit types&lt;/strong&gt; with appropriate emojis 📦 🐛 ♻️ 📖&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Shortcut commands&lt;/strong&gt; for quick commits (e.g., &lt;code&gt;gfeat&lt;/code&gt;, &lt;code&gt;gfix&lt;/code&gt;, &lt;code&gt;grel&lt;/code&gt;, etc.)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Automatic &lt;code&gt;git push&lt;/code&gt;&lt;/strong&gt; after committing changes&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Color-coded logs&lt;/strong&gt; for better visibility&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;No extra configuration needed&lt;/strong&gt; – works out of the box!  &lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Installation
&lt;/h2&gt;

&lt;p&gt;Git Styler should be installed &lt;strong&gt;globally&lt;/strong&gt; so that commands are available system-wide.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; git-styler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ &lt;strong&gt;Avoid local installation&lt;/strong&gt; (&lt;code&gt;npm install git-styler&lt;/code&gt;), as the commands won't be recognized outside the project.  &lt;/p&gt;

&lt;h2&gt;
  
  
  📌 How It Works
&lt;/h2&gt;

&lt;p&gt;Git Styler introduces easy-to-remember commands for different commit types. Here are some examples:  &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Emoji&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gfeat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;📦&lt;/td&gt;
&lt;td&gt;NEW (Feature)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gimp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;👌&lt;/td&gt;
&lt;td&gt;IMPROVE (Enhancement)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gfix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🐛&lt;/td&gt;
&lt;td&gt;FIX (Bug Fix)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gdoc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;📖&lt;/td&gt;
&lt;td&gt;DOC (Documentation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gtest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🤖&lt;/td&gt;
&lt;td&gt;TEST (Testing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gbreak&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;‼️&lt;/td&gt;
&lt;td&gt;BREAKING (Breaking Change)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;grel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🦄&lt;/td&gt;
&lt;td&gt;RELEASE (Release)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gref&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;♻️&lt;/td&gt;
&lt;td&gt;REFACTOR (Refactor Code)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  ✨ Usage Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Standard Commit
&lt;/h3&gt;

&lt;p&gt;Instead of writing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Added a new authentication module"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gfeat &lt;span class="s2"&gt;"Added a new authentication module"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 This automatically formats the commit as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"📦 NEW: Added a new authentication module"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2️⃣ Releasing a New Version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;grel &lt;span class="s2"&gt;"Version 1.0.0 release"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 This runs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"🦄 RELEASE: Version 1.0.0 release"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔍 Debugging &amp;amp; Help
&lt;/h2&gt;

&lt;p&gt;If you run into any issues, check available commands with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git-styler &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠️ How Git Styler Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;Git Styler is built using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Commander.js&lt;/strong&gt; – For handling CLI commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;child_process&lt;/strong&gt; – To execute Git commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;path module&lt;/strong&gt; – For script detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool intercepts Git commands and ensures they follow a structured format before committing. No extra configuration is needed! 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  📢 Spread the Word!
&lt;/h2&gt;

&lt;p&gt;If you find Git Styler useful, please &lt;strong&gt;star the GitHub repo&lt;/strong&gt; and share it with your team! ⭐&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/shyamtala003/git-styler" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Start making your commit history cleaner today!&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; git-styler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let me know what you think in the comments! Happy coding! 🎉&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>cli</category>
      <category>commit</category>
    </item>
  </channel>
</rss>
