<?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: Bhupesh Chandra Joshi</title>
    <description>The latest articles on DEV Community by Bhupesh Chandra Joshi (@bhupeshchandrajoshi).</description>
    <link>https://dev.to/bhupeshchandrajoshi</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%2F1931767%2Ffb73ef56-faf6-4992-9ee8-6ce544b122b6.jpeg</url>
      <title>DEV Community: Bhupesh Chandra Joshi</title>
      <link>https://dev.to/bhupeshchandrajoshi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bhupeshchandrajoshi"/>
    <language>en</language>
    <item>
      <title>How Instagram Stores Your Reels, Photos, and Drafts (Without Exploding Your Phone or Their Servers)</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Sun, 31 May 2026 04:24:34 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/how-instagram-stores-your-reels-photos-and-drafts-without-exploding-your-phone-or-their-servers-4k11</link>
      <guid>https://dev.to/bhupeshchandrajoshi/how-instagram-stores-your-reels-photos-and-drafts-without-exploding-your-phone-or-their-servers-4k11</guid>
      <description>&lt;p&gt;&lt;em&gt;Spoiler: Your half-finished dance Reel isn't living in the cloud yet. It's probably just chilling in your phone's "temp" folder like a cat in your  bedroom.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The Hero’s Journey: From Cringe Reel to Viral (Maybe)
&lt;/h3&gt;

&lt;p&gt;Picture this: You’re in your room at 2 AM, lights off, phone in hand, recording the most fire lip-sync Reel of your life. You nail the transition (finally), add some trending audio, and then… you hit &lt;strong&gt;Save Draft&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Congratulations. You just triggered a sophisticated media storage system that Instagram (and every other social app) has perfected so you don’t rage-quit when your draft disappears after closing the app.&lt;/p&gt;

&lt;p&gt;Let’s go behind the scenes, dev-style — with zero proprietary leaks, just solid architecture thinking wrapped in dad jokes.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Why Social Media Apps Obsess Over Media Storage
&lt;/h3&gt;

&lt;p&gt;Social apps are basically digital landfills that &lt;em&gt;must&lt;/em&gt; look like luxury boutiques.&lt;/p&gt;

&lt;p&gt;Every second, millions of people upload photos and videos. If the app is slow, laggy, or eats your battery like it’s free pizza, you uninstall it faster than you ghost a bad date. &lt;/p&gt;

&lt;p&gt;Efficient media storage is the difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Wow, Instagram is so smooth" &lt;/li&gt;
&lt;li&gt;"Why is this app using 3GB of RAM to show me my aunt’s cat video?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal? &lt;strong&gt;Make everything feel instant while actually being extremely clever about where and how data lives.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Before Upload: Local Storage is King
&lt;/h3&gt;

&lt;p&gt;When you record a Reel or take a photo, Instagram &lt;strong&gt;doesn’t&lt;/strong&gt; immediately ship it to their servers. That would be dumb.&lt;/p&gt;

&lt;p&gt;Instead, it saves the raw file &lt;strong&gt;locally&lt;/strong&gt; on your device. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You might delete it in 3 seconds&lt;/li&gt;
&lt;li&gt;You have no internet (trains, flights, denial)&lt;/li&gt;
&lt;li&gt;Uploading 4K video on mobile data costs more than your monthly rent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On Android, this usually means the app’s private storage (&lt;code&gt;/data/data/com.instagram.android/...&lt;/code&gt;) or scoped storage. On iOS, it’s in the app’s sandbox. &lt;/p&gt;

&lt;p&gt;The file sits there like a guilty secret — full resolution, untouched, waiting for your decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Saving a Draft = "I’m Not Ready for the World to See This"
&lt;/h3&gt;

&lt;p&gt;When you tap &lt;strong&gt;Save Draft&lt;/strong&gt;, Instagram does a few smart things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It creates a &lt;strong&gt;local database entry&lt;/strong&gt; (probably SQLite or Realm) with metadata: video path, caption draft, filters applied, music choice, etc.&lt;/li&gt;
&lt;li&gt;The actual media file stays in local storage.&lt;/li&gt;
&lt;li&gt;It might generate a &lt;strong&gt;low-res thumbnail&lt;/strong&gt; right there on your phone for quick preview in the draft list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How do drafts survive app restarts or phone reboots?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Simple. The app reads from its local database on launch and rebuilds the draft list. No cloud needed yet. This is why your drafts usually stay even if you force-close the app (unless you clear app data — then RIP).&lt;/p&gt;

&lt;p&gt;It’s like writing a love letter but hiding it in your sock drawer instead of mailing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Local Storage vs Cloud Storage: The Eternal Struggle
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Local Storage&lt;/th&gt;
&lt;th&gt;Cloud Storage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;Lightning fast&lt;/td&gt;
&lt;td&gt;Depends on your internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost to user&lt;/td&gt;
&lt;td&gt;Eats your phone storage&lt;/td&gt;
&lt;td&gt;Eats your data plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;Dies if you uninstall/clear data&lt;/td&gt;
&lt;td&gt;Survives device changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When used&lt;/td&gt;
&lt;td&gt;Recording, drafts, editing&lt;/td&gt;
&lt;td&gt;Final upload, feed content&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Instagram uses a &lt;strong&gt;hybrid&lt;/strong&gt; approach — local first, cloud when necessary. This is product thinking at its finest.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Uploading Large Media Files Efficiently (The "Please Don't Crash" Strategy)
&lt;/h3&gt;

&lt;p&gt;Uploading a 60-second 4K Reel? That’s basically sending a small movie file.&lt;/p&gt;

&lt;p&gt;Instagram doesn’t upload it as one giant blob. They use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chunked uploads&lt;/strong&gt; — break the video into smaller pieces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resumable uploads&lt;/strong&gt; — if your connection drops, it continues from where it left off&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background uploads&lt;/strong&gt; — so you can keep scrolling while your masterpiece uploads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They also do &lt;strong&gt;client-side compression&lt;/strong&gt; before upload (more on this below).&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Media Processing &amp;amp; Compression: Making Your Video Smaller Without Looking Like 2009 YouTube
&lt;/h3&gt;

&lt;p&gt;Once the file reaches Instagram’s servers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The video is &lt;strong&gt;transcoded&lt;/strong&gt; into multiple versions (different resolutions and bitrates)&lt;/li&gt;
&lt;li&gt;They run heavy compression (H.264/H.265, VP9, AV1 depending on platform)&lt;/li&gt;
&lt;li&gt;Audio is normalized, filters applied server-side if needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is why your Reel looks good on both a cheap Android and an iPhone Pro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compression is basically digital plastic surgery&lt;/strong&gt; — remove the ugly bits while keeping the soul.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Thumbnail Generation &amp;amp; Previews
&lt;/h3&gt;

&lt;p&gt;Nobody waits for full video to load.&lt;/p&gt;

&lt;p&gt;Instagram generates multiple thumbnails:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tiny blurhash (those colorful placeholder squares)&lt;/li&gt;
&lt;li&gt;Low-res preview&lt;/li&gt;
&lt;li&gt;Proper poster image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tiny versions load instantly so the feed feels snappy even on slow networks.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Caching Frequently Viewed Content
&lt;/h3&gt;

&lt;p&gt;This is where the magic happens for &lt;em&gt;you&lt;/em&gt; as a user.&lt;/p&gt;

&lt;p&gt;When you open the Explore page or a friend’s profile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The app checks its &lt;strong&gt;local cache&lt;/strong&gt; first (images/videos stored in device storage or memory cache like Glide/Picasso on Android, SDWebImage on iOS)&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;cache policies&lt;/strong&gt; (e.g., "stale-while-revalidate")&lt;/li&gt;
&lt;li&gt;Evicts old content intelligently so your phone doesn’t become a digital hoarder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your favorite meme account’s posts are probably living rent-free in your cache right now.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Content Delivery Using CDNs (The Global Pizza Delivery of Media)
&lt;/h3&gt;

&lt;p&gt;Instagram doesn’t serve videos from one giant server in California.&lt;/p&gt;

&lt;p&gt;They use &lt;strong&gt;CDNs&lt;/strong&gt; (Content Delivery Networks) — servers spread across the world.&lt;/p&gt;

&lt;p&gt;When you watch a Reel from Agra, India, it’s probably coming from a server in Mumbai or Delhi, not California. This reduces latency dramatically.&lt;/p&gt;

&lt;p&gt;Think of it as Netflix knowing you always watch from your couch and putting the movie closer to your house.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. The Grand Balancing Act: Storage, Performance &amp;amp; UX
&lt;/h3&gt;

&lt;p&gt;Behind all the funny cat videos is serious engineering trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Storage costs&lt;/strong&gt; → Compress aggressively, delete old processed versions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User experience&lt;/strong&gt; → Keep drafts local, make everything feel instant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Battery &amp;amp; data&lt;/strong&gt; → Smart prefetching, background tasks, quality adaptation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt; → Process once, serve many (original → many variants)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Next time you save a draft Reel of you trying (and failing) to do the latest dance trend, just know there’s an entire orchestra of systems working silently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your phone babysitting the raw file&lt;/li&gt;
&lt;li&gt;Smart databases remembering your creative vision&lt;/li&gt;
&lt;li&gt;Servers ready to compress, transcode, and distribute your masterpiece globally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All so you can post at 3 AM and immediately regret it by morning.&lt;/p&gt;

&lt;p&gt;Modern mobile apps aren’t just apps anymore. They’re sophisticated distributed media management systems disguised as dopamine machines.&lt;/p&gt;

&lt;p&gt;And honestly? It’s kind of beautiful.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What do you think?&lt;/strong&gt; Have you ever lost a perfect draft and wondered what dark magic could have saved it? Drop your worst "I lost my Reel" horror story in the comments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Like if you learned something. Share if your draft folder is also a graveyard of abandoned creativity.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>instagram</category>
      <category>chaicode</category>
      <category>react</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>How WhatsApp Works Without Internet: Offline Messaging and Sync Explained? (The "Airplane Mode Magic" Edition)</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Fri, 29 May 2026 11:19:05 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/how-whatsapp-works-without-internet-offline-messaging-and-sync-explained-the-airplane-mode-ng9</link>
      <guid>https://dev.to/bhupeshchandrajoshi/how-whatsapp-works-without-internet-offline-messaging-and-sync-explained-the-airplane-mode-ng9</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hey there, fellow digital survivors!&lt;/strong&gt; 👋&lt;/p&gt;

&lt;p&gt;I'm that developer who once tried sending a "I love mom " message to mother on mothers day... while flying 30,000 feet above the Atlantic in airplane mode. The message showed up instantly on my screen like a confident liar. Two hours later, when wheels touched the ground, it actually flew. &lt;/p&gt;

&lt;p&gt;Welcome to the chaotic, beautiful world of &lt;strong&gt;offline-first messaging&lt;/strong&gt; — where WhatsApp acts like that overly optimistic Expo CLI dev who keeps building even when the bundler is screaming. This blog belongs to my mother, and when you are traveling and want to message family ,the offline messaging comes into the pitchure.&lt;br&gt;
Let's implement the flying dream and implement it now, hard work.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Airplane Mode Tragedy (That Actually Works)
&lt;/h3&gt;

&lt;p&gt;Picture this:&lt;/p&gt;

&lt;p&gt;You’re in a metro tunnel (classic Agra-Delhi route vibes), no bars, full airplane mode. You type:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Bhai, paani ki tanki khali ho gayi hai, emergency!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You hit send. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boom.&lt;/strong&gt; Blue ticks? No. But the message appears in the chat &lt;strong&gt;instantly&lt;/strong&gt;. Your friend’s reply (which they sent 5 minutes ago) also magically shows up later.&lt;/p&gt;

&lt;p&gt;How? Because WhatsApp isn’t a naive lover waiting for internet. It’s a &lt;strong&gt;professional offline-first hero&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Why Messaging Apps Need Offline Support (The "Real World Sucks" Reason)
&lt;/h3&gt;

&lt;p&gt;Internet is like Mumbai local trains — unreliable, crowded, and disappears when you need it most.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You go to villages with 2G (if lucky)&lt;/li&gt;
&lt;li&gt;Elevators, flights, basements, Jio/ airtel network in 2026 (still struggling)&lt;/li&gt;
&lt;li&gt;Your mom calls you during a power cut&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users expect apps to &lt;strong&gt;work like real life conversations&lt;/strong&gt; — you speak even if the other person is in the bathroom. Apps that don’t support offline feel like cheap Chinese earphones — one sneeze and connection gone.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. What Happens When You Send a Message Without Internet?
&lt;/h3&gt;

&lt;p&gt;Your phone becomes a &lt;strong&gt;drama queen with commitment issues&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you hit send:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;WhatsApp says "Cool story bro" and &lt;strong&gt;immediately shows the message&lt;/strong&gt; in your chat.&lt;/li&gt;
&lt;li&gt;It doesn’t even &lt;em&gt;try&lt;/em&gt; to send it to the server yet.&lt;/li&gt;
&lt;li&gt;It marks it internally as "pending" with a single gray tick (the "I’m trying my best" tick).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It’s like ordering food on Zomato during a blackout — the order is placed in the app, but Swiggy’s kitchen doesn’t know yet.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Local Storage &amp;amp; Message Persistence (The "SQLite is my Therapist" Moment)
&lt;/h3&gt;

&lt;p&gt;This is where &lt;strong&gt;Expo devs&lt;/strong&gt; start nodding aggressively.&lt;/p&gt;

&lt;p&gt;WhatsApp (built on React Native, just like your Expo projects) uses &lt;strong&gt;local databases&lt;/strong&gt; (SQLite under the hood or similar encrypted storage):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every message you type is saved locally &lt;strong&gt;first&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Your entire chat history lives on your phone.&lt;/li&gt;
&lt;li&gt;Even if you restart the app 50 times, messages don’t disappear.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s like writing your resignation letter in Google Docs offline. The document exists. The boss just doesn’t know he’s fired yet.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Message Queueing on the Device (The Pending Action Gang)
&lt;/h3&gt;

&lt;p&gt;WhatsApp maintains a &lt;strong&gt;local queue&lt;/strong&gt; of actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send Message A&lt;/li&gt;
&lt;li&gt;Send Message B
&lt;/li&gt;
&lt;li&gt;Upload photo of your dog wearing sunglasses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This queue is like that list of tasks you write on Sunday night but only complete on Friday.&lt;/p&gt;

&lt;p&gt;Every pending message sits in this queue with metadata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;li&gt;Message ID (UUID — very important)&lt;/li&gt;
&lt;li&gt;Recipient&lt;/li&gt;
&lt;li&gt;Retry count (because networks are chaotic)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Syncing Messages When Connectivity Returns (The Grand Reconciliation)
&lt;/h3&gt;

&lt;p&gt;The moment internet comes back (Jio ka "Network Not Available" disappears):&lt;/p&gt;

&lt;p&gt;WhatsApp goes into &lt;strong&gt;"I have places to be"&lt;/strong&gt; mode:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fires all queued messages to the server&lt;/li&gt;
&lt;li&gt;Pulls any messages that arrived while you were offline&lt;/li&gt;
&lt;li&gt;Does a beautiful dance of &lt;strong&gt;eventual consistency&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the part where Expo CLI would say &lt;code&gt;expo publish&lt;/code&gt; after 47 failed builds.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Delivery States: The Emotional Journey
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Visual&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Vibe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sent&lt;/td&gt;
&lt;td&gt;One gray tick&lt;/td&gt;
&lt;td&gt;"I said it"&lt;/td&gt;
&lt;td&gt;Hopeful&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivered&lt;/td&gt;
&lt;td&gt;Two gray ticks&lt;/td&gt;
&lt;td&gt;"Server received it"&lt;/td&gt;
&lt;td&gt;Relieved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read&lt;/td&gt;
&lt;td&gt;Two blue ticks&lt;/td&gt;
&lt;td&gt;"They saw it and chose silence"&lt;/td&gt;
&lt;td&gt;Existential crisis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These states are updated &lt;strong&gt;asynchronously&lt;/strong&gt;. Your phone keeps polling or uses push notifications to update the UI.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. Handling Media Uploads While Offline (The Real Boss Level)
&lt;/h3&gt;

&lt;p&gt;Sending a 17MB video in airplane mode?&lt;/p&gt;

&lt;p&gt;WhatsApp:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stores the media locally&lt;/li&gt;
&lt;li&gt;Shows it in chat with "Pending" overlay&lt;/li&gt;
&lt;li&gt;Queues the upload&lt;/li&gt;
&lt;li&gt;When online, uploads in background (with progress)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s like preparing a PowerPoint presentation offline and uploading it when your boss is in a good mood.&lt;/p&gt;




&lt;h3&gt;
  
  
  8. Conflict Resolution &amp;amp; Message Ordering (When Two People Text at Once)
&lt;/h3&gt;

&lt;p&gt;This is where &lt;strong&gt;system design&lt;/strong&gt; gets spicy.&lt;/p&gt;

&lt;p&gt;WhatsApp uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Timestamps&lt;/strong&gt; (device time + server time reconciliation)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unique Message IDs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector clocks&lt;/strong&gt; or logical clocks (in more advanced setups)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If two messages cross each other while offline, the server decides order based on arrival time.&lt;/p&gt;

&lt;p&gt;Sometimes it feels random. Like Indian traffic — no rules, only vibes.&lt;/p&gt;




&lt;h3&gt;
  
  
  9. Reliability vs Real-time Delivery Tradeoffs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Offline-first&lt;/strong&gt; philosophy says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Better to show something immediately and fix it later than to show nothing."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is why you sometimes see messages appear, then suddenly reorder when sync happens. Rare, but possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eventual Consistency&lt;/strong&gt; in simple words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Everything will be fine... eventually. Chill."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  10. How Offline-First Architecture Improves Usability
&lt;/h3&gt;

&lt;p&gt;Because of this architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You never lose a message (unless you delete the app)&lt;/li&gt;
&lt;li&gt;Feels &lt;strong&gt;instant&lt;/strong&gt; even on terrible networks&lt;/li&gt;
&lt;li&gt;Works in villages, flights, and during bandhs&lt;/li&gt;
&lt;li&gt;Battery efficient (doesn’t hammer server when offline)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s the reason your mom can forward 47 "Good Morning" messages even when her network is worse than her jokes.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Grand Architecture (For My Fellow Expo CLI Warriors)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
mermaid
graph TD
    A[User Types Message] --&amp;gt; B[Local Storage]
    B --&amp;gt; C[Message Queue]
    C --&amp;gt; D[UI Shows Instantly]
    D --&amp;gt; E[Internet Returns]
    E --&amp;gt; F[Sync Engine]
    F --&amp;gt; G[Server]
    G --&amp;gt; H[Delivery Receipts]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>chaicode</category>
      <category>javascript</category>
      <category>reactnative</category>
      <category>expocli</category>
    </item>
    <item>
      <title>Expo Router vs React Navigation - Which One Should You Use in 2026?</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Wed, 20 May 2026 01:55:14 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/expo-router-vs-react-navigation-which-one-should-you-use-in-2026-3khj</link>
      <guid>https://dev.to/bhupeshchandrajoshi/expo-router-vs-react-navigation-which-one-should-you-use-in-2026-3khj</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR (2026 Verdict):&lt;/strong&gt; For most new React Native projects—especially those using Expo—&lt;strong&gt;choose Expo Router&lt;/strong&gt;. It delivers superior developer experience, automatic deep linking, file-based routing that scales with teams, and excellent web parity with minimal boilerplate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React Navigation&lt;/strong&gt; remains the right choice for brownfield native integrations, highly bespoke custom transitions, or when you need maximum low-level control outside the Expo ecosystem. Expo Router is built on top of React Navigation, so you're not abandoning its power—you're gaining a smarter convention layer.&lt;/p&gt;

&lt;p&gt;As a Senior Mobile Solutions Architect who's shipped dozens of production React Native apps, here's my practical, battle-tested comparison.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Evolution: Routing as State Management for Screens
&lt;/h3&gt;

&lt;p&gt;Routing in mobile apps is &lt;strong&gt;state management for screens&lt;/strong&gt;: it decides &lt;em&gt;which&lt;/em&gt; screen is visible, manages the navigation stack/history, handles transitions, deep links, and preserves state as users move around.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React Navigation&lt;/strong&gt; (the OG) gave us a robust, flexible imperative/config-based system. It became the de facto standard because it worked reliably across complex flows and gave fine-grained control over navigators (Stack, Tab, Drawer, etc.).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expo Router&lt;/strong&gt; is the modern evolution. Introduced to solve real pain points in large codebases, it builds directly on React Navigation while adding file-based routing, automatic deep linking, TypeScript inference, and universal (web + native) capabilities. In 2026, it's mature, production-proven, and the default recommendation for most new apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Paradigm Shift: Imperative Configuration vs. Declarative File-Based Routing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;React Navigation&lt;/strong&gt; (Imperative/Configuration-based):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You manually define navigators and register screens in code (often a central &lt;code&gt;App.tsx&lt;/code&gt; or spread across modules).&lt;/li&gt;
&lt;li&gt;Adding a screen? Update the navigator config + import the component.&lt;/li&gt;
&lt;li&gt;Nested navigation requires explicit nesting of navigators.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Expo Router&lt;/strong&gt; (Declarative/File-based):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your folder structure &lt;em&gt;is&lt;/em&gt; your routes. Create a file → it becomes a route.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_layout.tsx&lt;/code&gt; files define the navigator type and shared UI for that segment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example Folder Structure (The Lightbulb Moment):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/app
  ├── _layout.tsx          # Root layout (Providers, Theme, Auth guard)
  ├── (auth)               # Route group (no URL segment)
  │   ├── _layout.tsx      # Auth Stack
  │   ├── login.tsx        # /login
  │   └── register.tsx     # /register
  ├── (tabs)               # Tab group
  │   ├── _layout.tsx      # Bottom Tabs config
  │   ├── index.tsx        # Home (/)
  │   └── profile.tsx      # /profile
  └── [user].tsx           # Dynamic: /bhupesh_joshi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This maps directly to navigation. No massive config file. New team members can read the folder and understand the app structure instantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The 'Deep Linking' Argument: Web/Mobile Parity Wins
&lt;/h3&gt;

&lt;p&gt;Expo Router treats every route as deep-linkable by default. No separate linking config hell. This shines for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Universal apps (same code for mobile + web)&lt;/li&gt;
&lt;li&gt;Shareable content&lt;/li&gt;
&lt;li&gt;SEO on web (static rendering, meta tags)&lt;/li&gt;
&lt;li&gt;Universal Links / App Links&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React Navigation requires manual setup for deep linking and has weaker web support. In 2026, with more teams building universal experiences, this is a major advantage.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Technical Deep Dive
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Protected Routes &amp;amp; Authentication
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Expo Router&lt;/strong&gt; (Clean):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;redirect&lt;/code&gt; in &lt;code&gt;_layout.tsx&lt;/code&gt; with &lt;code&gt;useRootNavigationState&lt;/code&gt; or a custom hook.&lt;/li&gt;
&lt;li&gt;Slot pattern for layouts.&lt;/li&gt;
&lt;li&gt;Auth state lives high; redirects are declarative.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;React Navigation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conditional rendering of different root navigators (AuthStack vs AppStack) based on auth state.&lt;/li&gt;
&lt;li&gt;Works well but leads to more imperative logic and potential state synchronization issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Performance &amp;amp; Bundle Behavior
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expo Router&lt;/strong&gt;: Automatic route-based bundle splitting (lazy loading via Suspense), deferred bundling. Smaller initial bundles, especially beneficial on web. Navigation transitions remain native and smooth (powered by React Navigation + react-native-screens).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Navigation&lt;/strong&gt;: Excellent runtime performance. You manage bundling yourself. In large apps, the central config can bloat the main bundle if not careful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Developer Workflow&lt;/strong&gt;: Expo Router wins decisively. No hunting through a giant navigator file. Changes are localized to files/folders. Tooling (TypeScript routes, auto-completion) is superior.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. When to Stick with React Navigation
&lt;/h3&gt;

&lt;p&gt;Don't migrate existing stable apps just for the hype. Stick with (or choose) React Navigation when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highly bespoke navigation transitions or gestures that push Expo Router's conventions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brownfield integrations&lt;/strong&gt; — adding React Native to an existing native app where you control the native navigation layer tightly.&lt;/li&gt;
&lt;li&gt;Apps that cannot (or prefer not to) use the Expo SDK/monorepo setup.&lt;/li&gt;
&lt;li&gt;Maximum flexibility with non-serializable data passing or deeply custom navigator compositions.&lt;/li&gt;
&lt;li&gt;Teams with heavy existing investment in custom React Navigation utilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Final Verdict Table (2026)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Expo Router&lt;/th&gt;
&lt;th&gt;React Navigation&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DX / Boilerplate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Excellent (file-based)&lt;/td&gt;
&lt;td&gt;Good (more config)&lt;/td&gt;
&lt;td&gt;Expo Router&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability (Teams)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Superior (self-documenting structure)&lt;/td&gt;
&lt;td&gt;Good (explicit but verbose)&lt;/td&gt;
&lt;td&gt;Expo Router&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web Support / Deep Linking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;First-class, automatic&lt;/td&gt;
&lt;td&gt;Manual, more work&lt;/td&gt;
&lt;td&gt;Expo Router&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Great + bundle splitting&lt;/td&gt;
&lt;td&gt;Excellent native&lt;/td&gt;
&lt;td&gt;Tie (contextual)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Customization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Good (falls back to RN APIs)&lt;/td&gt;
&lt;td&gt;Maximum control&lt;/td&gt;
&lt;td&gt;React Nav&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Learning Curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gentle for web devs&lt;/td&gt;
&lt;td&gt;Familiar for RN veterans&lt;/td&gt;
&lt;td&gt;Depends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enterprise Maintainability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (conventions)&lt;/td&gt;
&lt;td&gt;High (explicit)&lt;/td&gt;
&lt;td&gt;Expo Router (new)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Real-World Advice from the Trenches
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New Greenfield Project in Expo?&lt;/strong&gt; → Expo Router. The productivity gains compound.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large Team/Dashboard App with Auth + Tabs + Nested Stacks?&lt;/strong&gt; → Expo Router enforces clean boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex Animations or Native Module Heavy?&lt;/strong&gt; → Evaluate both, but lean React Navigation if conventions feel restrictive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production Adoption&lt;/strong&gt;: Many teams have successfully migrated 60k+ MAU apps. Others run hybrid approaches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mental Model Shift&lt;/strong&gt;: Stop thinking "I need to register this screen." Start thinking "Where does this screen live in the URL/app hierarchy?"&lt;/p&gt;

&lt;p&gt;Expo Router doesn't replace React Navigation—it elevates it with conventions that make teams faster and code more maintainable. In 2026, for the majority of production-grade apps, that's the winning approach.&lt;/p&gt;

&lt;p&gt;Choose based on your constraints, not hype. But if you're starting fresh, &lt;strong&gt;Expo Router is the 2026 default&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Build something great.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>webdev</category>
      <category>chaicode</category>
      <category>expocli</category>
    </item>
    <item>
      <title>How Instagram, WhatsApp, Uber &amp; Netflix Would Be Built Today Using Expo Router</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Wed, 20 May 2026 01:30:58 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/how-instagram-whatsapp-uber-netflix-would-be-built-today-using-expo-router-549g</link>
      <guid>https://dev.to/bhupeshchandrajoshi/how-instagram-whatsapp-uber-netflix-would-be-built-today-using-expo-router-549g</guid>
      <description>&lt;p&gt;&lt;em&gt;Modern large-scale mobile apps demand maintainable architecture, scalable navigation, robust state management, and production-grade performance. Expo Router makes this achievable in React Native with file-based routing inspired by Next.js.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. How Modern Large-Scale Mobile Apps Are Structured
&lt;/h3&gt;

&lt;p&gt;Today's apps like Instagram, WhatsApp, Uber, and Netflix follow &lt;strong&gt;modular, feature-driven architectures&lt;/strong&gt;. Core principles include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Separation of concerns&lt;/strong&gt;: UI, business logic, data, and navigation are isolated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Easy onboarding for new developers and adding features without breaking existing code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Lazy loading, code splitting, and optimized rendering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform consistency&lt;/strong&gt;: Shared code for iOS, Android, and often web.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expo Router excels here with its file-system routing, nested layouts, and built-in support for deep linking, protected routes, and async bundles.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Why Architecture Matters in React Native Applications
&lt;/h3&gt;

&lt;p&gt;Poor architecture leads to "spaghetti code," slow performance, difficult debugging, and scaling bottlenecks. A solid structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces bugs and improves maintainability.&lt;/li&gt;
&lt;li&gt;Enables parallel development by teams.&lt;/li&gt;
&lt;li&gt;Supports offline capabilities, real-time updates, and complex navigation.&lt;/li&gt;
&lt;li&gt;Optimizes bundle size and startup time for production apps serving millions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In large apps, &lt;strong&gt;feature-based separation&lt;/strong&gt; trumps simple type-based folders (e.g., all components in one place).&lt;/p&gt;

&lt;h3&gt;
  
  
  3-4. Folder Architecture Using Expo Router + Feature-Based Separation
&lt;/h3&gt;

&lt;p&gt;A scalable structure often looks like this (inspired by community best practices):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── app/                      # Expo Router routes (file-based)
│   ├── (auth)/               # Route groups (no URL segment)
│   │   ├── login.tsx
│   │   └── _layout.tsx
│   ├── (tabs)/               # Bottom tabs
│   │   ├── home/
│   │   ├── explore/
│   │   └── profile/
│   ├── feed/
│   ├── chat/[id].tsx         # Dynamic routes
│   └── _layout.tsx           # Root layout
├── features/                 # Feature-based modules
│   ├── feed/
│   │   ├── components/
│   │   ├── hooks/
│   │   ├── api.ts
│   │   └── store.ts
│   ├── chat/
│   ├── ride/                 # For Uber-like
│   └── profile/
├── components/               # Shared UI (design system)
├── lib/                      # Utils, API client, config
├── hooks/                    # Global custom hooks
├── store/                    # State management
├── services/                 # API, realtime, storage
├── types/
└── utils/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Routes reflect user flows. Features are self-contained (screens + logic together), making them easy to move, test, or remove.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Navigation Architecture for Scalable Apps
&lt;/h3&gt;

&lt;p&gt;Expo Router uses &lt;strong&gt;file-based routing&lt;/strong&gt; with powerful layouts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;_layout.tsx&lt;/code&gt; files define Stack, Tabs, or Drawer navigators.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route groups&lt;/strong&gt; &lt;code&gt;(group)&lt;/code&gt; for logical grouping without URL impact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nested routing&lt;/strong&gt; for complex flows (e.g., tabs inside a stack).&lt;/li&gt;
&lt;li&gt;Deep linking and universal links out of the box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared layouts&lt;/strong&gt; for consistent headers, sidebars, or tab bars.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example for Instagram-like tabs + modals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Root stack handles auth/modals.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;(tabs)&lt;/code&gt; group for main navigation.&lt;/li&gt;
&lt;li&gt;Dynamic routes like &lt;code&gt;post/[id]&lt;/code&gt; for details.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Authentication Flow Architecture
&lt;/h3&gt;

&lt;p&gt;Use &lt;strong&gt;protected routes&lt;/strong&gt; in Expo Router v5+:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Root &lt;code&gt;_layout&lt;/code&gt; checks auth state and redirects.&lt;/li&gt;
&lt;li&gt;Splash screen until auth loads (use &lt;code&gt;SecureStore&lt;/code&gt; or similar for tokens).&lt;/li&gt;
&lt;li&gt;Separate &lt;code&gt;(auth)&lt;/code&gt; and &lt;code&gt;(app)&lt;/code&gt; route groups.&lt;/li&gt;
&lt;li&gt;Context/Provider for user/session state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common stack: Clerk, Supabase Auth, or custom with JWTs + refresh logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. State Management Strategies for Large Apps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client state&lt;/strong&gt; (UI, forms): Zustand (lightweight, slices) or Jotai.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server state&lt;/strong&gt; (API data): TanStack Query (caching, invalidation, background sync).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global/complex&lt;/strong&gt;: Redux Toolkit for very large teams.&lt;/li&gt;
&lt;li&gt;Local persistence: MMKV + Redux Persist or WatermelonDB/SQLite for heavy offline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combine with React Compiler for automatic memoization optimizations.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. API Handling and Networking Layers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Centralized API client (Axios/Fetch wrapper) in &lt;code&gt;services/api.ts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;TanStack Query for mutations/queries with optimistic updates.&lt;/li&gt;
&lt;li&gt;Interceptors for auth tokens, retries, and error handling.&lt;/li&gt;
&lt;li&gt;Code generation for types (e.g., from OpenAPI).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9. Realtime Systems
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chat (WhatsApp-like)&lt;/strong&gt;: Supabase Realtime, Socket.io, or Stream Chat. Use WebSockets + optimistic UI + background sync.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live updates&lt;/strong&gt;: TanStack Query subscriptions or dedicated realtime DB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ride tracking (Uber)&lt;/strong&gt;: &lt;code&gt;expo-location&lt;/code&gt; + WebSockets for driver position. Map with react-native-maps. Polling fallback for reliability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Handle reconnections, message ordering, and delivery status carefully.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Offline-First Support and Caching
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: Expo SQLite / WatermelonDB or Realm for complex data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sync&lt;/strong&gt;: TanStack Query + custom queues or libraries like PowerSync.&lt;/li&gt;
&lt;li&gt;NetInfo for connectivity detection.&lt;/li&gt;
&lt;li&gt;Cache images/media with &lt;code&gt;expo-file-system&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Optimistic updates + conflict resolution on reconnect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instagram feed and Netflix downloads thrive on this.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. App Startup Optimization Techniques
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Splash screen&lt;/strong&gt; until critical data/auth loads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async routes&lt;/strong&gt; and lazy loading in Expo Router for code splitting.&lt;/li&gt;
&lt;li&gt;Preload critical assets.&lt;/li&gt;
&lt;li&gt;Minimize JS bundle (tree shaking, React Compiler).&lt;/li&gt;
&lt;li&gt;Deferred non-critical initialization.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  12. Performance Considerations in Production Apps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;React.memo&lt;/code&gt;, &lt;code&gt;useMemo&lt;/code&gt;, &lt;code&gt;useCallback&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;FlatList with proper &lt;code&gt;keyExtractor&lt;/code&gt; and &lt;code&gt;getItemLayout&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Reanimated for smooth animations (worklets on UI thread).&lt;/li&gt;
&lt;li&gt;Image optimization (&lt;code&gt;expo-image&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Monitor with Sentry/Flipper.&lt;/li&gt;
&lt;li&gt;Enable New Architecture where possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test on low-end devices.&lt;/p&gt;

&lt;h3&gt;
  
  
  13. Shared Layouts and Nested Routing in Expo Router
&lt;/h3&gt;

&lt;p&gt;Layouts wrap children and persist state across navigation. Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Persistent tab bars.&lt;/li&gt;
&lt;li&gt;Auth wrappers.&lt;/li&gt;
&lt;li&gt;Theme providers.&lt;/li&gt;
&lt;li&gt;Custom headers that change per route.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nested stacks inside tabs handle modals and details seamlessly.&lt;/p&gt;

&lt;h3&gt;
  
  
  14. Scalability Challenges in Specific Apps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instagram&lt;/strong&gt;: Infinite feeds (virtualized lists + pagination), media-heavy (caching/preloading), stories (horizontal carousels + realtime). High engagement needs excellent scroll performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp&lt;/strong&gt;: End-to-end encryption (handle on backend), massive realtime messaging scale, media sharing, groups, status. Reliability over everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uber&lt;/strong&gt;: Geolocation accuracy, real-time matching/tracking, payments, maps integration. Safety and low-latency critical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Netflix&lt;/strong&gt;: Video streaming (background playback), personalized recommendations (caching), profiles, offline downloads. Smooth UI for catalogs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expo Router handles their navigation patterns elegantly with groups and nesting.&lt;/p&gt;

&lt;h3&gt;
  
  
  15. Tradeoffs and Architectural Decisions at Scale
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File-based vs Config&lt;/strong&gt;: Expo Router enforces structure (good for teams) but less flexible than pure React Navigation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monolith vs Micro-frontends&lt;/strong&gt;: Feature modules allow incremental scaling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Modules&lt;/strong&gt;: For heavy perf (maps, video), use Expo modules or custom.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend Choices&lt;/strong&gt;: Supabase/Firebase for speed vs custom for full control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt;: Unit (Jest), component (Testing Library), E2E (Maestro/Detox).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monorepo&lt;/strong&gt;: Turborepo/Nx for shared packages across apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tradeoff Example&lt;/strong&gt;: Zustand for simplicity vs Redux for debugging tools in huge teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion: Building Like the Big Apps Today
&lt;/h3&gt;

&lt;p&gt;With &lt;strong&gt;Expo Router + modern stack&lt;/strong&gt; (TypeScript, TanStack Query, Zustand, Reanimated, SQLite), a small team can build apps rivaling giants in architecture and UX. Focus on modularity, performance from day one, and user-centric features.&lt;/p&gt;

&lt;p&gt;Start with a solid folder structure and protected layouts — the rest scales naturally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommended Reading&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expo Router Docs&lt;/li&gt;
&lt;li&gt;Feature-based architecture guides&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>chaicode</category>
      <category>mobile</category>
      <category>whatsapp</category>
      <category>netflix</category>
    </item>
    <item>
      <title>REST API Design Made Simple with Express.js: A Beginner-Friendly Guide</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Sat, 09 May 2026 05:43:34 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/rest-api-design-made-simple-with-expressjs-a-beginner-friendly-guide-2202</link>
      <guid>https://dev.to/bhupeshchandrajoshi/rest-api-design-made-simple-with-expressjs-a-beginner-friendly-guide-2202</guid>
      <description>&lt;p&gt;Master REST API design with Express.js. Learn HTTP methods, clean routing, status codes, and real-world best practices through practical examples. Perfect for Node.js beginners and frontend developers moving to backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;. Hero Section Intro&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine walking into your favorite restaurant. You don’t go into the kitchen and cook the food yourself. You tell the waiter what you want, and they bring it back. &lt;/p&gt;

&lt;p&gt;That waiter? That’s your &lt;strong&gt;API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll turn you from someone who’s “heard of REST” into someone who can confidently build clean, professional REST APIs with Express.js — using the “users” resource as our main example.&lt;/p&gt;

&lt;p&gt;No fluff. Just practical, modern Node.js that you can use in real projects today. Let’s dive in! 🚀&lt;/p&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;REST&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt; &lt;span class="nx"&gt;Design&lt;/span&gt; &lt;span class="nx"&gt;Made&lt;/span&gt; &lt;span class="nx"&gt;Simple&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nx"&gt;Express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;

&lt;span class="nx"&gt;Hey&lt;/span&gt; &lt;span class="nx"&gt;there&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nx"&gt;If&lt;/span&gt; &lt;span class="nx"&gt;you&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;re a beginner Node.js developer, a React dev exploring the backend, or preparing for interviews, this guide is for you.

We&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="nx"&gt;ll&lt;/span&gt; &lt;span class="nx"&gt;explore&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;REST&lt;/span&gt; &lt;span class="nx"&gt;APIs&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;using&lt;/span&gt; &lt;span class="nx"&gt;Express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nx"&gt;real&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;world&lt;/span&gt; &lt;span class="nx"&gt;analogies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;clean&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;modern&lt;/span&gt; &lt;span class="nx"&gt;patterns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="nx"&gt;What&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;an&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;

&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;API&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;stands&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Application&lt;/span&gt; &lt;span class="nx"&gt;Programming&lt;/span&gt; &lt;span class="nx"&gt;Interface&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="nx"&gt;Think&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;that&lt;/span&gt; &lt;span class="nx"&gt;allows&lt;/span&gt; &lt;span class="nx"&gt;two&lt;/span&gt; &lt;span class="nx"&gt;pieces&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;software&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;talk&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;each&lt;/span&gt; &lt;span class="nx"&gt;other&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;your&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mobile&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="nx"&gt;Postman&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;sends&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Server&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;processes&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;sends&lt;/span&gt; &lt;span class="nx"&gt;back&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Real&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;world&lt;/span&gt; &lt;span class="nx"&gt;analogy&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;When&lt;/span&gt; &lt;span class="nx"&gt;you&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="nx"&gt;food&lt;/span&gt; &lt;span class="nx"&gt;via&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;delivery&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;you&lt;/span&gt; &lt;span class="nx"&gt;don&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="nx"&gt;cook&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt; &lt;span class="nx"&gt;yourself&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;You&lt;/span&gt; &lt;span class="nx"&gt;make&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nf"&gt;restaurant &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;prepares&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;delivers&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nf"&gt;response &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;your&lt;/span&gt; &lt;span class="nx"&gt;food&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="nx"&gt;What&lt;/span&gt; &lt;span class="nx"&gt;Does&lt;/span&gt; &lt;span class="nx"&gt;REST&lt;/span&gt; &lt;span class="nx"&gt;Mean&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;

&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;REST&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;RE&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;presentational&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;S&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;tate&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;ransfer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="nx"&gt;It&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="nx"&gt;an&lt;/span&gt; &lt;span class="nx"&gt;architectural&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="nx"&gt;introduced&lt;/span&gt; &lt;span class="nx"&gt;by&lt;/span&gt; &lt;span class="nx"&gt;Roy&lt;/span&gt; &lt;span class="nx"&gt;Fielding&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;RESTful&lt;/span&gt; &lt;span class="nx"&gt;APIs&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt; &lt;span class="nx"&gt;standard&lt;/span&gt; &lt;span class="nx"&gt;HTTP&lt;/span&gt; &lt;span class="nx"&gt;methods&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;perform&lt;/span&gt; &lt;span class="nx"&gt;operations&lt;/span&gt; &lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;resources&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="err"&gt;###&lt;/span&gt; &lt;span class="nx"&gt;Key&lt;/span&gt; &lt;span class="nx"&gt;Characteristics&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;REST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Stateless&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Each&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="nx"&gt;contains&lt;/span&gt; &lt;span class="nx"&gt;all&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;information&lt;/span&gt; &lt;span class="nx"&gt;needed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;The&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="nx"&gt;doesn&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="nx"&gt;remember&lt;/span&gt; &lt;span class="nx"&gt;previous&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Uses&lt;/span&gt; &lt;span class="nx"&gt;HTTP&lt;/span&gt; &lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;verbs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Resources&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;are&lt;/span&gt; &lt;span class="nf"&gt;nouns &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;URLs&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Cacheable&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;layered&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;uniform&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Why&lt;/span&gt; &lt;span class="nx"&gt;did&lt;/span&gt; &lt;span class="nx"&gt;REST&lt;/span&gt; &lt;span class="nx"&gt;win&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;It&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="nx"&gt;simple&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;scalable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;works&lt;/span&gt; &lt;span class="nx"&gt;beautifully&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="nx"&gt;Resources&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;REST&lt;/span&gt; &lt;span class="nx"&gt;Architecture&lt;/span&gt;

&lt;span class="nx"&gt;In&lt;/span&gt; &lt;span class="nx"&gt;REST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;everything&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nx"&gt;usually&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;noun&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="nx"&gt;Example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Posts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Products&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="nx"&gt;We&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;plural&lt;/span&gt; &lt;span class="nx"&gt;nouns&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;collection&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;`/users`&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;collection&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;all&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;`/users/42`&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;single&lt;/span&gt; &lt;span class="nf"&gt;user &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Pro&lt;/span&gt; &lt;span class="nx"&gt;Tip&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Stick&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;plural&lt;/span&gt; &lt;span class="nx"&gt;naming&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;It&lt;/span&gt; &lt;span class="nx"&gt;feels&lt;/span&gt; &lt;span class="nx"&gt;natural&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;industry&lt;/span&gt; &lt;span class="nx"&gt;standard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="nx"&gt;HTTP&lt;/span&gt; &lt;span class="nx"&gt;Methods&lt;/span&gt; &lt;span class="nx"&gt;Explained&lt;/span&gt;

&lt;span class="nx"&gt;Let&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="nx"&gt;real&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;life&lt;/span&gt; &lt;span class="nx"&gt;actions&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;HTTP&lt;/span&gt; &lt;span class="nx"&gt;methods&lt;/span&gt; &lt;span class="nx"&gt;using&lt;/span&gt; &lt;span class="nx"&gt;our&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="err"&gt;###&lt;/span&gt; &lt;span class="nx"&gt;GET&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nx"&gt;Fetch&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Purpose&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Retrieve&lt;/span&gt; &lt;span class="nf"&gt;resources &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;safe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idempotent&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nx"&gt;Analogy&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Asking&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;waiter&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;What&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;menu&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;Show&lt;/span&gt; &lt;span class="nx"&gt;me&lt;/span&gt; &lt;span class="nx"&gt;my&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
js&lt;br&gt;
// GET /users - Get all users&lt;br&gt;
app.get('/users', async (req, res) =&amp;gt; {&lt;br&gt;
  const users = await User.find();&lt;br&gt;
  res.json(users);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// GET /users/:id - Get one user&lt;br&gt;
app.get('/users/:id', async (req, res) =&amp;gt; {&lt;br&gt;
  const user = await User.findById(req.params.id);&lt;br&gt;
  if (!user) return res.status(404).json({ message: "User not found" });&lt;br&gt;
  res.json(user);&lt;br&gt;
});&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
### POST — Create new resource
**Purpose**: Create something new.

**Analogy**: Placing a new order.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
js&lt;br&gt;
app.post('/users', async (req, res) =&amp;gt; {&lt;br&gt;
  const newUser = await User.create(req.body);&lt;br&gt;
  res.status(201).json(newUser);&lt;br&gt;
});&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
### PUT — Update/replace resource
**Purpose**: Update an existing resource (idempotent).

**Analogy**: Replacing your entire order.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
js&lt;br&gt;
app.put('/users/:id', async (req, res) =&amp;gt; {&lt;br&gt;
  const updatedUser = await User.findByIdAndUpdate(req.params.id, req.body, { new: true });&lt;br&gt;
  res.json(updatedUser);&lt;br&gt;
});&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
### DELETE — Remove resource
**Purpose**: Delete a resource.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
js&lt;br&gt;
app.delete('/users/:id', async (req, res) =&amp;gt; {&lt;br&gt;
  await User.findByIdAndDelete(req.params.id);&lt;br&gt;
  res.status(204).send(); // No content&lt;br&gt;
});&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## CRUD vs HTTP Methods Mapping

| CRUD Operation | HTTP Method | Example Route       | Status Code |
|----------------|-------------|---------------------|-------------|
| Create         | POST        | POST /users         | 201         |
| Read (all)     | GET         | GET /users          | 200         |
| Read (one)     | GET         | GET /users/:id      | 200         |
| Update         | PUT         | PUT /users/:id      | 200         |
| Delete         | DELETE      | DELETE /users/:id   | 204         |

## Express.js Setup (Modern Way)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
mkdir rest-api-tutorial&lt;br&gt;
cd rest-api-tutorial&lt;br&gt;
npm init -y&lt;br&gt;
npm install express dotenv cors helmet morgan&lt;br&gt;
npm install -D nodemon&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
**package.json** scripts:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
json&lt;br&gt;
"scripts": {&lt;br&gt;
  "dev": "nodemon src/server.js"&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
**src/server.js**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
js&lt;br&gt;
import express from 'express';&lt;br&gt;
import cors from 'cors';&lt;br&gt;
import helmet from 'helmet';&lt;br&gt;
import morgan from 'morgan';&lt;br&gt;
import dotenv from 'dotenv';&lt;/p&gt;

&lt;p&gt;dotenv.config();&lt;/p&gt;

&lt;p&gt;const app = express();&lt;/p&gt;

&lt;p&gt;// Middleware&lt;br&gt;
app.use(helmet());           // Security&lt;br&gt;
app.use(cors());             // Enable CORS&lt;br&gt;
app.use(morgan('dev'));      // Logging&lt;br&gt;
app.use(express.json());     // Parse JSON bodies&lt;/p&gt;

&lt;p&gt;app.get('/', (req, res) =&amp;gt; {&lt;br&gt;
  res.json({ message: "Welcome to the Users API! 👋" });&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// Routes will go here&lt;/p&gt;

&lt;p&gt;const PORT = process.env.PORT || 5000;&lt;br&gt;
app.listen(PORT, () =&amp;gt; {&lt;br&gt;
  console.log(&lt;code&gt;🚀 Server running on port ${PORT}&lt;/code&gt;);&lt;br&gt;
});&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Building User Routes

Create a clean structure:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
src/&lt;br&gt;
  routes/&lt;br&gt;
    users.js&lt;br&gt;
  controllers/&lt;br&gt;
    userController.js&lt;br&gt;
  models/&lt;br&gt;
    User.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Status Codes Basics (The Language of the Web)

- **200 OK** — Everything went fine.
- **201 Created** — Resource was successfully created.
- **400 Bad Request** — Client sent something wrong.
- **404 Not Found** — Resource doesn’t exist.
- **500 Internal Server Error** — Something broke on the server (hide details in production!).

**Mini Summary**: Status codes tell the client what happened — use them correctly!

## REST Request-Response Lifecycle

1. **Client** sends request (Postman / frontend)
2. **Middleware** processes it (auth, validation, logging)
3. **Route** matches the URL + method
4. **Controller** contains business logic
5. **Model/Database** interaction
6. **Response** sent back with proper status code

## Best Practices for Professional APIs

- Always use plural resource names
- Consistent response formats
- Implement proper error handling
- Add API versioning (`/api/v1/users`)
- Validate input data
- Use meaningful status codes

## Common Mistakes Beginners Make

- Using verbs in URLs (`/createUser`, `/getAllUsers`)
- Returning different response shapes inconsistently
- Using `res.send()` for everything instead of `res.json()`
- Forgetting to handle errors properly
- Hardcoding sensitive values

## Packages That Make APIs More Professional

Here’s your pro toolkit:

- **express** — The foundation
- **nodemon** — Auto-restarts server during development
- **dotenv** — Manage environment variables
- **cors** — Handle cross-origin requests
- **helmet** — Add security headers
- **morgan** — Request logging
- **express-async-handler** — Clean async route handling (no try/catch everywhere)
- **zod** — Modern, TypeScript-friendly validation
- **jsonwebtoken + bcrypt** — Authentication &amp;amp; password hashing

**Pro Tip**: Start simple, then layer these packages as your API grows.

## Real-World Companies Using Node.js + REST

Companies like **Netflix**, **LinkedIn**, **PayPal**, **Uber**, and many startups use Node.js and REST (or REST-like) APIs for their backend services.

## Conclusion

You now understand REST API design fundamentals and how to implement them cleanly with Express.js!

**Next Steps Learning Roadmap:**
1. Add authentication (JWT)
2. Connect to MongoDB/PostgreSQL
3. Implement proper validation with Zod
4. Write tests (Jest + Supertest)
5. Deploy to Render / Railway / Vercel

You’ve got this! Start building your own API today.

---

## Suggested Tags for Hashnode
`nodejs`, `expressjs`, `restapi`, `backend`, `webdevelopment`, `javascript`, `tutorial`, `beginners`

## Suggested Cover Image Idea
A modern, clean illustration showing a restaurant waiter (API) serving data dishes to a customer (client) with HTTP method labels floating around. Use calming tech colors (blues, purples, greens).

## Suggested LinkedIn Post for Promotion

"Just published: REST API Design Made Simple with Express.js 🔥

If you’re a frontend dev trying to understand backend or a Node.js beginner, this one’s for you.

We cover resources, HTTP methods, clean routing, status codes, and modern Express patterns — all with real analogies and production-ready code.

Check it out and let me know which part was most helpful! 👇


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Why Node.js is Perfect for Building Fast Web Applications</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Sat, 09 May 2026 05:29:19 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/why-nodejs-is-perfect-for-building-fast-web-applications-21a0</link>
      <guid>https://dev.to/bhupeshchandrajoshi/why-nodejs-is-perfect-for-building-fast-web-applications-21a0</guid>
      <description>&lt;p&gt;Imagine launching a web app that handles thousands of users simultaneously—real-time chats firing off messages, APIs responding instantly, dashboards updating live—without melting your servers or burning through your cloud budget. That's the promise Node.js delivers every day for companies like Netflix, Uber, and PayPal.&lt;/p&gt;

&lt;p&gt;As a senior backend engineer who's spent years building scalable systems, I've watched Node.js transform how we think about web performance. It's not magic, but its architecture feels close when you see it handle concurrency that would cripple traditional stacks.&lt;/p&gt;

&lt;p&gt;In this deep dive, we'll explore exactly &lt;em&gt;why&lt;/em&gt; Node.js excels at fast web applications. We'll go beyond buzzwords into the internals, with analogies, code, diagrams (described for easy recreation), and production insights.&lt;/p&gt;

&lt;h3&gt;
  
  
  Table of Contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The Traditional Server Struggle&lt;/li&gt;
&lt;li&gt;What Makes Node.js Fast&lt;/li&gt;
&lt;li&gt;Non-Blocking I/O: The Real Superpower&lt;/li&gt;
&lt;li&gt;Event-Driven Architecture and the Event Loop&lt;/li&gt;
&lt;li&gt;The Single-Threaded Model Explained (No, It's Not a Limitation)&lt;/li&gt;
&lt;li&gt;Blocking vs Non-Blocking: A Side-by-Side Comparison&lt;/li&gt;
&lt;li&gt;Where Node.js Shines (and Where It Doesn't)&lt;/li&gt;
&lt;li&gt;Real-World Companies and Wins&lt;/li&gt;
&lt;li&gt;Practical Code Examples&lt;/li&gt;
&lt;li&gt;Event Loop Deep Dive&lt;/li&gt;
&lt;li&gt;Key Takeaways&lt;/li&gt;
&lt;li&gt;FAQ&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Traditional Server Struggle
&lt;/h3&gt;

&lt;p&gt;Traditional web servers (think old-school PHP or Java thread-per-request models) work like a busy restaurant where each customer gets their own dedicated waiter. One slow order (database query, file read, API call) ties up that waiter completely. Under high traffic, you need &lt;em&gt;tons&lt;/em&gt; of waiters (threads/processes), leading to high memory use, context switching overhead, and eventual slowdowns or crashes.&lt;/p&gt;

&lt;p&gt;Modern web apps spend most of their time &lt;em&gt;waiting&lt;/em&gt;—not computing. They're I/O-bound: hitting databases, calling external APIs, reading files, or streaming data. Node.js was built specifically for this reality.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Makes Node.js Fast
&lt;/h3&gt;

&lt;p&gt;Node.js is a runtime environment built on Chrome's V8 JavaScript engine. Here's why it delivers speed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V8 Engine + JIT Compilation&lt;/strong&gt;: V8 compiles JavaScript to machine code on the fly (Just-In-Time). Hot code paths get optimized aggressively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight Runtime&lt;/strong&gt;: No heavy JVM or interpreter overhead. Starts fast and uses memory efficiently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async Execution Model&lt;/strong&gt;: The core philosophy—everything possible is non-blocking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Speed in web apps isn't just raw CPU cycles. It's about &lt;strong&gt;throughput&lt;/strong&gt; and &lt;strong&gt;responsiveness&lt;/strong&gt; under load. Node.js optimizes for the common case where apps wait on networks and disks far more than they crunch numbers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Non-Blocking I/O: The Heart of Node.js Performance
&lt;/h3&gt;

&lt;p&gt;This is the centerpiece. Let's use the classic &lt;strong&gt;restaurant analogy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blocking (Traditional) Model&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer 1 orders steak (slow database query).&lt;/li&gt;
&lt;li&gt;Waiter stands there waiting for the kitchen.&lt;/li&gt;
&lt;li&gt;Customer 2, 3, 4... wait in line. No one else gets served until Customer 1 is done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Non-Blocking Node.js Model&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer 1 orders steak.&lt;/li&gt;
&lt;li&gt;Waiter takes the order, hands the ticket to the kitchen, and immediately moves to Customer 2.&lt;/li&gt;
&lt;li&gt;When the kitchen rings the bell (operation complete), the waiter comes back &lt;em&gt;just for that dish&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;One waiter (single thread) handles dozens of tables efficiently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In code terms:&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;// Blocking style (what you'd see in many other languages)&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`SELECT * FROM users WHERE id = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&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="c1"&gt;// Blocks!&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Node.js async/await (modern, clean)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`SELECT * FROM users WHERE id = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&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="c1"&gt;// Non-blocking&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&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;While waiting for the database, Node.js's event loop continues processing other requests. This dramatically improves throughput.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Callback and Promise styles&lt;/strong&gt; (still common):&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;// Callback style&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&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;err&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="o"&gt;=&amp;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="k"&gt;throw&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;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;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Promise style&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="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;promises&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&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;&lt;strong&gt;Diagram 1: Blocking vs Non-Blocking Request Handling&lt;/strong&gt; (Mermaid or Excalidraw style)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Blocking Server:
Request1 --&amp;gt; [Thread1: DB wait...] --&amp;gt; Response1
Request2 --&amp;gt; [Waiting for Thread] 
Request3 --&amp;gt; [Queue builds up]

Node.js:
Request1 --&amp;gt; [Event Loop] --&amp;gt; Delegate DB --&amp;gt; Continue other requests
          &amp;lt;-- [Callback when DB done] -- Response1
Request2,3,4... all flow through the same loop efficiently
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Event-Driven Architecture
&lt;/h3&gt;

&lt;p&gt;Node.js is built around events. You register listeners, and the runtime notifies you when things happen.&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;EventEmitter&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="s1"&gt;events&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;emitter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EventEmitter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;emitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;userLoggedIn&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;user&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Welcome, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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="nf"&gt;sendWelcomeEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;emitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;userLoggedIn&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alex&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;Real-world examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebSockets for chat apps: &lt;code&gt;socket.on('message', handler)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;File watchers, HTTP request events, database change streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture scales beautifully for real-time systems because it reacts only when needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diagram 2: Node.js Request Lifecycle&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Incoming Request 
    ↓
Event Loop (checks queues)
    ↓
Route Handler / Middleware
    ↓ (if async I/O)
Delegate to libuv → Continue loop
    ↓ (when ready)
Callback / Promise resolution → Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Single-Threaded Model Explained
&lt;/h3&gt;

&lt;p&gt;Yes, Node.js runs JavaScript on a single thread. But that doesn't mean it's slow or can't handle concurrency.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript execution&lt;/strong&gt; is single-threaded (avoids race conditions and complex locking).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;libuv&lt;/strong&gt; (C++ layer) provides a thread pool for true async I/O operations (file system, DNS, etc.).&lt;/li&gt;
&lt;li&gt;Heavy CPU work can be offloaded to Worker Threads (since Node 10+).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Concurrency vs Parallelism&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Concurrency: Two tasks &lt;em&gt;in progress&lt;/em&gt; (overlapping in time). Node.js excels here.&lt;/li&gt;
&lt;li&gt;Parallelism: Two tasks &lt;em&gt;executing simultaneously&lt;/em&gt; on different cores. Possible via workers or clustering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Restaurant Analogy Update&lt;/strong&gt;: One highly efficient cashier (event loop) taking orders and dispatching to a kitchen with multiple chefs (thread pool + OS async I/O). No expensive "context switching" between waiters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When it becomes a limitation&lt;/strong&gt;: Pure CPU-bound tasks (image processing, ML, complex calculations). Solution: Worker Threads, scale horizontally with PM2/Cluster, or use microservices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blocking vs Non-Blocking Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Traditional (Blocking/Thread-per-request)&lt;/th&gt;
&lt;th&gt;Node.js (Event Loop)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory Usage&lt;/td&gt;
&lt;td&gt;High (each thread consumes stack)&lt;/td&gt;
&lt;td&gt;Low (single thread + efficient)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability (Concurrent Users)&lt;/td&gt;
&lt;td&gt;Limited by threads/processes&lt;/td&gt;
&lt;td&gt;Excellent for I/O-heavy workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Under High Traffic&lt;/td&gt;
&lt;td&gt;Context switching kills performance&lt;/td&gt;
&lt;td&gt;Handles spikes gracefully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer Experience&lt;/td&gt;
&lt;td&gt;Easier mental model for some&lt;/td&gt;
&lt;td&gt;Async requires learning curve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time Capabilities&lt;/td&gt;
&lt;td&gt;Possible but heavier&lt;/td&gt;
&lt;td&gt;Natural fit (WebSockets, SSE)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Behavior under load: A blocking server might serve 100 requests well but choke at 1000. Node.js keeps the kitchen humming.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where Node.js Performs Best
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Ideal Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST/GraphQL APIs&lt;/li&gt;
&lt;li&gt;Real-time apps (chat, collaboration, dashboards)&lt;/li&gt;
&lt;li&gt;Streaming services&lt;/li&gt;
&lt;li&gt;Microservices&lt;/li&gt;
&lt;li&gt;IoT backends&lt;/li&gt;
&lt;li&gt;Notification systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not Ideal&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU-intensive workloads (use Python/Go/Rust for those parts)&lt;/li&gt;
&lt;li&gt;Heavy file manipulation or scientific computing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It shines when your app is I/O-bound and you value developer velocity (full-stack JavaScript).&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-World Companies Using Node.js
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Netflix&lt;/strong&gt;: Reduced startup time dramatically and powers real-time features for millions of users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PayPal&lt;/strong&gt;: Rewrote parts in Node.js—35% faster responses, 33% less code, double the requests per second.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uber&lt;/strong&gt;: Handles millions of concurrent ride requests and real-time matching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walmart&lt;/strong&gt;: Survived Black Friday with 500M+ page views, fewer servers, zero downtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn&lt;/strong&gt;: Massive reduction in servers while doubling traffic capacity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shared JavaScript ecosystem (frontend + backend) accelerates development significantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical Code Examples
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Basic Express Server with Async&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;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="s1"&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="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="s1"&gt;/users/:id&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="k"&gt;try&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;user&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;getUserFromDB&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;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;orders&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;getUserOrders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;orders&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="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;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUserFromDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Simulating async DB&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jane&lt;/span&gt;&lt;span class="dl"&gt;'&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Streaming Example&lt;/strong&gt; (perfect for Node.js):&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="s1"&gt;/video&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createReadStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;movie.mp4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&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="c1"&gt;// Non-blocking streaming&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;Concurrent Requests Simulation&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Multiple incoming requests don't block each other. The event loop juggles them effortlessly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Event Loop Deep Dive
&lt;/h3&gt;

&lt;p&gt;The event loop has phases: timers, pending callbacks, idle/prepare, poll, check, close callbacks.&lt;/p&gt;

&lt;p&gt;Simplified:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Call stack executes synchronous code.&lt;/li&gt;
&lt;li&gt;Async operations go to libuv / Web APIs.&lt;/li&gt;
&lt;li&gt;Completed tasks enter callback queue or microtask queue.&lt;/li&gt;
&lt;li&gt;Event loop moves them to call stack when it's empty.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Diagram 3: Event Loop Phases&lt;/strong&gt; (text visualization)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────┐
│   Timers (setTimeout)│
├──────────────────────┤
│   Pending Callbacks  │
├──────────────────────┤
│   Poll (I/O)         │ ← Heart
├──────────────────────┤
│   Check (setImmediate)│
└──────────────────────┘
     ↑ Loop repeats
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is why &lt;code&gt;setTimeout(0)&lt;/code&gt; doesn't run immediately—other phases matter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js speed comes from &lt;strong&gt;non-blocking I/O&lt;/strong&gt; and the &lt;strong&gt;event loop&lt;/strong&gt;, not raw CPU power.&lt;/li&gt;
&lt;li&gt;It trades parallelism for efficient concurrency.&lt;/li&gt;
&lt;li&gt;Perfect for I/O-heavy, real-time, modern web apps.&lt;/li&gt;
&lt;li&gt;Learn async patterns deeply for production success.&lt;/li&gt;
&lt;li&gt;Combine with clustering/workers for maximum scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  FAQ
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Is Node.js single-threaded?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes for JS execution, but it leverages OS and thread pools under the hood.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can it handle CPU-heavy tasks?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes, with Worker Threads or by offloading to other services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does it compare to Go/Rust?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Node.js wins on developer experience and ecosystem for many web use cases; others may edge out on raw performance for specific workloads.&lt;/p&gt;

&lt;p&gt;Node.js isn't perfect for every problem, but for building &lt;em&gt;fast&lt;/em&gt; web applications in today's async-first world, it's one of the best tools available. Start small, embrace async/await, and watch your apps scale.&lt;/p&gt;

&lt;p&gt;What Node.js project are you building next? Drop a comment—I'd love to hear!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Happy coding!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>express</category>
    </item>
    <item>
      <title>What is Middleware in Express and How It Works</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Sat, 09 May 2026 05:23:28 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/what-is-middleware-in-express-and-how-it-works-31a7</link>
      <guid>https://dev.to/bhupeshchandrajoshi/what-is-middleware-in-express-and-how-it-works-31a7</guid>
      <description>&lt;p&gt;If you've spent any time with Node.js, you've probably heard the word middleware thrown around like everyone already agrees on what it means. The truth is, middleware is one of those concepts that sounds abstract until you see it in action — and once you do, Express suddenly makes a lot more sense.&lt;/p&gt;

&lt;p&gt;In this article, we'll break middleware down the way I wish someone had explained it to me when I started: with analogies, diagrams, and real code you'd actually write on the job.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;So, What Is Middleware?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In Express, middleware is just a function that sits between the incoming request and the final response.&lt;/p&gt;

&lt;p&gt;Think of it as a checkpoint. Every request that hits your server has to walk down a hallway of checkpoints before it reaches the route handler that actually does the work. Each checkpoint can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inspect the request&lt;/li&gt;
&lt;li&gt;Modify the request or response&lt;/li&gt;
&lt;li&gt;End the request early (e.g., reject it)&lt;/li&gt;
&lt;li&gt;Or pass it along to the next checkpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. No magic. A middleware function in Express has this signature:&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;middleware&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="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// do something&lt;/span&gt;
  &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// pass control to the next middleware&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three arguments: &lt;code&gt;req&lt;/code&gt;, &lt;code&gt;res&lt;/code&gt;, and &lt;code&gt;next&lt;/code&gt;. The &lt;code&gt;next&lt;/code&gt; is what makes the chain move forward.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Where Middleware Sits in the Request Lifecycle&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's the mental model I want you to lock in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client Request
      │
      ▼
┌─────────────┐
│ Middleware 1│  ── logging
└─────────────┘
      │ next()
      ▼
┌─────────────┐
│ Middleware 2│  ── authentication
└─────────────┘
      │ next()
      ▼
┌─────────────┐
│ Middleware 3│  ── validation
└─────────────┘
      │ next()
      ▼
┌─────────────┐
│ Route Handler│ ── business logic
└─────────────┘
      │
      ▼
   Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every request flows through this pipeline. Middleware is the plumbing; route handlers are the destination.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Types of Middleware&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Express groups middleware into a few categories. You don't need to memorize them — just know what each one looks like.&lt;/p&gt;

&lt;p&gt;a) Application-Level Middleware&lt;/p&gt;

&lt;p&gt;Bound to your &lt;code&gt;app&lt;/code&gt; instance. Runs for every request (or every request matching a path).&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;// Runs for every request&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;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;log&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&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="nf"&gt;next&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;b) Router-Level Middleware&lt;/p&gt;

&lt;p&gt;Same idea, but scoped to an &lt;code&gt;express.Router()&lt;/code&gt; instance. Useful when you want middleware that only affects a section of your app — say, all &lt;code&gt;/admin&lt;/code&gt; routes.&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;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;router&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;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;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;Admin route hit&lt;/span&gt;&lt;span class="dl"&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="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;router&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;/dashboard&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;Welcome, admin&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;c) Built-in Middleware&lt;/p&gt;

&lt;p&gt;Express ships with a few out of the box. The two you'll use constantly:&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;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;// parses JSON bodies&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;urlencoded&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;extended&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="c1"&gt;// parses form bodies&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;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;             &lt;span class="c1"&gt;// serves static files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;d) Third-Party Middleware&lt;/p&gt;

&lt;p&gt;Installed from npm. Examples: &lt;code&gt;cors&lt;/code&gt;, &lt;code&gt;helmet&lt;/code&gt;, &lt;code&gt;morgan&lt;/code&gt;, &lt;code&gt;cookie-parser&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cors&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;cors&lt;/span&gt;&lt;span class="dl"&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="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e) Error-Handling Middleware&lt;/p&gt;

&lt;p&gt;Same idea, but with four arguments. Express recognizes the signature and treats it as an 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;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="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;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 broke&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;ol&gt;
&lt;li&gt;Execution Order Matters — A Lot&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the part that trips people up. Middleware runs in the order you register it. Top to bottom. No exceptions.&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;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;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;1&lt;/span&gt;&lt;span class="dl"&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="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;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;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;2&lt;/span&gt;&lt;span class="dl"&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="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;/&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;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;3&lt;/span&gt;&lt;span class="dl"&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;Done&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;Hit &lt;code&gt;/&lt;/code&gt; and you'll see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1
2
3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you put your auth middleware after your route handler, it will never protect anything. Order is everything.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;The Role of &lt;code&gt;next()&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;next()&lt;/code&gt; is the baton in a relay race. If a middleware doesn't call it (and doesn't send a response), the request just hangs until it times out. This is one of the most common Express bugs.&lt;/p&gt;

&lt;p&gt;You have three choices inside any middleware:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Call &lt;code&gt;next()&lt;/code&gt; → pass control to the next middleware.&lt;/li&gt;
&lt;li&gt;Send a response (&lt;code&gt;res.send&lt;/code&gt;, &lt;code&gt;res.json&lt;/code&gt;, etc.) → end the cycle.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;next(err)&lt;/code&gt; → skip ahead to the nearest error-handling middleware.
&lt;/li&gt;
&lt;/ol&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;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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&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;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&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="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;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;Unauthorized&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// jumps to error handler&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Real-World Examples&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's stop being theoretical. Here are three middleware patterns you'll write in real projects.&lt;/p&gt;

&lt;p&gt;Example 1 — Logging&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;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;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&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;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;finish&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="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;ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&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="s2"&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;method&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&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="nx"&gt;res&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="s2"&gt; (&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;ms)`&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A poor man's &lt;code&gt;morgan&lt;/code&gt;. Useful for quick debugging.&lt;/p&gt;

&lt;p&gt;Example 2 — Authentication&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;requireAuth&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="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&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;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;split&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="mi"&gt;1&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&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;401&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;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;No token&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;verifyToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// attach user to request&lt;/span&gt;
    &lt;span class="nf"&gt;next&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;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;401&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;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;Invalid token&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;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;/profile&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;requireAuth&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;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;user&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;user&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;Notice how middleware can be applied to a single route, not just globally.&lt;/p&gt;

&lt;p&gt;Example 3 — Request Validation&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;validateUser&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="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;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&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;body&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;password&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="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;400&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;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;Email and password required&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="nf"&gt;next&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;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/signup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;validateUser&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="c1"&gt;// safe to assume email/password exist&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="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User created&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;In production you'd reach for &lt;code&gt;zod&lt;/code&gt; or &lt;code&gt;joi&lt;/code&gt;, but the pattern is the same.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Putting It All Together&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's a tiny but realistic Express app showing the full pipeline:&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;// 1. Built-in&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;// 2. Application-level (logging)&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;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;log&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&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="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Auth middleware on a specific 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;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;requireAuth&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="s2"&gt;`Welcome, &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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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="c1"&gt;// 4. Error handler — always last&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;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;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;message&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read it top to bottom. That's exactly the order a request travels.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Mental Model to Remember&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you forget everything else, remember this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Express is just a pipeline of functions. Middleware is each function in the pipe. &lt;code&gt;next()&lt;/code&gt; is what keeps water flowing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once that clicks, everything else — auth, logging, validation, error handling — is just a variation on the same pattern.&lt;/p&gt;




&lt;p&gt;Wrapping Up&lt;/p&gt;

&lt;p&gt;Middleware isn't a framework feature so much as a philosophy: small, composable functions that each do one thing, chained together to handle a request. Master it and you'll write Express apps that are easier to read, easier to debug, and easier to extend.&lt;/p&gt;

&lt;p&gt;Next time you reach for a giant route handler doing five things at once — stop. Ask yourself: could three small middlewares do this better? Usually, the answer is yes.&lt;/p&gt;

&lt;p&gt;Happy shipping. 🚀&lt;/p&gt;




</description>
      <category>node</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>JWT Authentication in Node.js: Explained Simply Guide</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Sat, 09 May 2026 05:11:34 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/jwt-authentication-in-nodejs-explained-simply-guide-3lhn</link>
      <guid>https://dev.to/bhupeshchandrajoshi/jwt-authentication-in-nodejs-explained-simply-guide-3lhn</guid>
      <description>&lt;p&gt;Authentication is one of those things every developer has to deal with. Let’s make it painless and actually understandable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Do We Even Need Authentication?
&lt;/h3&gt;

&lt;p&gt;Imagine your house. Without a lock, anyone can walk in. Authentication is the &lt;strong&gt;digital lock&lt;/strong&gt; for your app. It answers two questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who are you?&lt;/li&gt;
&lt;li&gt;Should you access this resource?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Traditional session-based auth stores user data on the server. That works, but it creates problems at scale (memory usage, sticky sessions, harder horizontal scaling).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JWT (JSON Web Token)&lt;/strong&gt; solves this with &lt;strong&gt;stateless authentication&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is JWT?
&lt;/h3&gt;

&lt;p&gt;JWT is a compact, self-contained token that securely transmits information between parties as a JSON object.&lt;/p&gt;

&lt;p&gt;Think of it as a &lt;strong&gt;secure digital ID card&lt;/strong&gt; that the user carries with them. The server issues it once, and the user presents it with every request. The server can verify it without looking up anything in a database.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Structure of a JWT (Three Parts)
&lt;/h3&gt;

&lt;p&gt;A JWT looks like this:&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="err"&gt;eyJhbGciOiJIUzI&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;NiIsInR&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="err"&gt;cCI&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="err"&gt;IkpXVCJ&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;.eyJzdWIiOiIxMjM&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;NTY&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;ODkwIiwibmFtZSI&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="err"&gt;IkpvaG&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;gRG&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;lIiwiaWF&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;IjoxNTE&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;MjM&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="err"&gt;MDIyfQ.SflKxwRJSMeKKF&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;QT&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;fwpMeJf&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="err"&gt;POk&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="err"&gt;yJV_adQssw&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="err"&gt;c&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It has &lt;strong&gt;three parts&lt;/strong&gt; separated by dots (&lt;code&gt;.&lt;/code&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Header&lt;/strong&gt; – What kind of token + signing algorithm (usually HS256 or RS256)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payload&lt;/strong&gt; – The actual data (claims): user ID, name, expiration time, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signature&lt;/strong&gt; – Ensures the token wasn’t tampered with&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: Never put sensitive data (passwords, credit cards) in the payload. The payload is only Base64 encoded — anyone can decode it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Why Use JWT? What Value Does It Add?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stateless &amp;amp; Scalable&lt;/strong&gt;: No server-side session storage needed. Perfect for microservices and distributed systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile &amp;amp; SPA Friendly&lt;/strong&gt;: Works beautifully with React, Vue, Angular, mobile apps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Faster validation (just cryptographic check).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-domain / CORS friendly&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in expiration&lt;/strong&gt; (you control it).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decentralized trust&lt;/strong&gt; (can be verified by multiple services).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs&lt;/strong&gt;: You can’t easily revoke a token before expiration (solutions exist: token blacklist, short expiry + refresh tokens).&lt;/p&gt;

&lt;h3&gt;
  
  
  Packages You’ll Need
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# npm&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;jsonwebtoken express bcryptjs dotenv cookie-parser

&lt;span class="c"&gt;# pnpm&lt;/span&gt;
pnpm add jsonwebtoken express bcryptjs dotenv cookie-parser

&lt;span class="c"&gt;# yarn&lt;/span&gt;
yarn add jsonwebtoken express bcryptjs dotenv cookie-parser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;jsonwebtoken&lt;/code&gt; → Create and verify JWTs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bcryptjs&lt;/code&gt; → Hash passwords securely&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dotenv&lt;/code&gt; → Environment variables (especially JWT secret)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cookie-parser&lt;/code&gt; → (Optional but recommended for httpOnly cookies)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Project Setup (Express + JWT)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Environment Variables (&lt;code&gt;.env&lt;/code&gt;)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JWT_SECRET=your_super_secret_key_here_make_it_long_and_random
JWT_EXPIRES_IN=1h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. User Login Flow
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// controllers/authController.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bcryptjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../models/User.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;login&lt;/span&gt; &lt;span class="o"&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&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;body&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;email&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&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="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;401&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;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid credentials&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;// Create JWT&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JWT_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;expiresIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JWT_EXPIRES_IN&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Option A: Send as JSON (common for SPAs)&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;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Option B: httpOnly cookie (more secure against XSS)&lt;/span&gt;
  &lt;span class="c1"&gt;// res.cookie('token', token, { httpOnly: true, secure: true, sameSite: 'strict' });&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Protecting Routes (Middleware)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// middleware/auth.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;protect&lt;/span&gt; &lt;span class="o"&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Check Authorization header&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;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bearer&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;token&lt;/span&gt; &lt;span class="o"&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;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// Or from cookie: token = req.cookies.token;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;token&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="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;401&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;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Not authorized&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="k"&gt;try&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;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JWT_SECRET&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;decoded&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="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;error&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="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;401&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;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Token invalid or expired&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;h4&gt;
  
  
  4. Using the Protected Route
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// routes/protected.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;protect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../middleware/auth.js&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;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;router&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="s1"&gt;/profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;protect&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;json&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome to your profile&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;user&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;user&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Visualizing the Flow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Login Flow&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User sends email + password → Server&lt;/li&gt;
&lt;li&gt;Server validates credentials&lt;/li&gt;
&lt;li&gt;Server creates JWT → Sends back to client&lt;/li&gt;
&lt;li&gt;Client stores token (localStorage / httpOnly cookie / memory)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Subsequent Request Flow&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client sends request with &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Middleware verifies signature + expiration&lt;/li&gt;
&lt;li&gt;If valid → &lt;code&gt;req.user&lt;/code&gt; is set → Route handler runs&lt;/li&gt;
&lt;li&gt;If invalid/expired → 401 Unauthorized&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Best Practices (Brain-Friendly Tips)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;short expiration&lt;/strong&gt; (15min–1h) + &lt;strong&gt;Refresh Tokens&lt;/strong&gt; for better security.&lt;/li&gt;
&lt;li&gt;Store JWT in &lt;strong&gt;httpOnly + Secure cookies&lt;/strong&gt; when possible (protects against XSS).&lt;/li&gt;
&lt;li&gt;Always validate and sanitize input.&lt;/li&gt;
&lt;li&gt;Use environment-specific secrets.&lt;/li&gt;
&lt;li&gt;Consider &lt;strong&gt;role-based access&lt;/strong&gt; (add &lt;code&gt;role&lt;/code&gt; in payload).&lt;/li&gt;
&lt;li&gt;Never trust the payload data blindly (it can be decoded).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Refresh Token Strategy (Quick Tip)
&lt;/h3&gt;

&lt;p&gt;Many production apps use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Short-lived &lt;strong&gt;Access Token&lt;/strong&gt; (JWT)&lt;/li&gt;
&lt;li&gt;Long-lived &lt;strong&gt;Refresh Token&lt;/strong&gt; (stored in database or httpOnly cookie)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives you the best of both worlds: security + good UX.&lt;/p&gt;

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

&lt;p&gt;JWT isn’t magic, but it’s an incredibly elegant solution for modern web and mobile applications. It trades a bit of control (revocation) for massive scalability and simplicity.&lt;/p&gt;

&lt;p&gt;Start simple. Implement basic JWT auth first. Then layer on refresh tokens, proper error handling, and rate limiting as your app grows.&lt;/p&gt;




&lt;p&gt;Happy coding! 🚀&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tags&lt;/em&gt;: #NodeJS #JWT #Authentication #ExpressJS #Backend #WebDevelopment&lt;/p&gt;




</description>
      <category>node</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Blocking vs Non-Blocking Code in Node.js: The Superpower That Makes Your Server Fly</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Sat, 09 May 2026 04:59:35 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/blocking-vs-non-blocking-code-in-nodejs-the-superpower-that-makes-your-server-fly-2b1b</link>
      <guid>https://dev.to/bhupeshchandrajoshi/blocking-vs-non-blocking-code-in-nodejs-the-superpower-that-makes-your-server-fly-2b1b</guid>
      <description>&lt;p&gt;Imagine your Node.js server as a world-class chef in a busy restaurant. One version of the chef can only cook one dish at a time and stands idle while waiting for water to boil. The other chef starts multiple dishes simultaneously, checks on the oven while chopping vegetables, and serves dozens of tables without breaking a sweat.&lt;/p&gt;

&lt;p&gt;That’s the difference between &lt;strong&gt;blocking&lt;/strong&gt; and &lt;strong&gt;non-blocking&lt;/strong&gt; code — and mastering it separates hobby projects from production-grade, scalable applications that win hackathons and attract clients.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. What is Blocking Code?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Blocking code&lt;/strong&gt; is synchronous code that stops everything until the current operation finishes.&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;// Blocking example&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&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="s1"&gt;fs&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;large-file.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ← Everything waits here&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;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The single-threaded event loop in Node.js is completely frozen during the file read. No other requests can be processed.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. What is Non-Blocking Code?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Non-blocking code&lt;/strong&gt; (asynchronous) initiates an operation and immediately moves on. When the operation finishes, a callback, Promise, or async/await handles the result.&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;// Non-blocking example&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&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="s1"&gt;fs/promises&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&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="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;large-file.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&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;log&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;span class="nf"&gt;readFile&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;I'm not waiting! Server is still responsive ✨&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;The event loop keeps spinning, handling new incoming requests while the file is being read in the background (by libuv thread pool).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Why Blocking Code Kills Server Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single-threaded nature&lt;/strong&gt;: Node.js runs on one main thread. Blocking it blocks the entire server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poor concurrency&lt;/strong&gt;: Under load, response times skyrocket and users see timeouts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wasted CPU cycles&lt;/strong&gt;: The thread just sits idle waiting for I/O.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability nightmare&lt;/strong&gt;: One slow database query or file operation can bring your whole application down.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real impact&lt;/strong&gt;: A blocking endpoint handling file uploads or heavy computation can make your entire API unresponsive even for simple &lt;code&gt;/ping&lt;/code&gt; requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analogy That Sticks (Brain-Friendly)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Blocking = Standing in line at a coffee shop while the barista makes one drink at a time and everyone waits.&lt;/p&gt;

&lt;p&gt;Non-blocking = The barista takes all orders, starts brewing multiple drinks in parallel using machines, and calls your name when ready while taking new orders.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Developers who internalize this analogy write dramatically better code.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Async Operations in Node.js — The Magic
&lt;/h3&gt;

&lt;p&gt;Node.js was built for this from day one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;libuv&lt;/strong&gt; handles async I/O behind the scenes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event Loop&lt;/strong&gt; + &lt;strong&gt;Thread Pool&lt;/strong&gt; (default 4 threads for CPU-intensive tasks).&lt;/li&gt;
&lt;li&gt;Modern JavaScript: &lt;code&gt;async/await&lt;/code&gt;, Promises, and top-level await (in modules).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Real-World Examples
&lt;/h3&gt;

&lt;h4&gt;
  
  
  File Handling Scenario
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Blocking (Bad for servers):&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="s1"&gt;/report&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./huge-report.pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Blocks everyone!&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="nx"&gt;report&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;Non-Blocking (Production Ready):&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="s1"&gt;/report&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="k"&gt;try&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;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./huge-report.pdf&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;report&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="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;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error generating report&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;h4&gt;
  
  
  Database Calls
&lt;/h4&gt;

&lt;p&gt;Never do this in production:&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT * FROM users WHERE id = ?&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;id&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// Blocking&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do 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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT * FROM users WHERE id = ?&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;id&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Popular ORMs like Prisma, Drizzle, Mongoose, and Sequelize all support async out of the box.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visualizing the Difference
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Blocking Execution Timeline:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request 1 ──[Read File (3s)]───────────────────────► Response
Request 2 ────────────────────[Waiting]───────────► Delayed
Request 3 ───────────────────────────────[Waiting]► Delayed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Non-Blocking Execution Timeline:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request 1 ──[Start Read]──────► (continues) ───────► Response (after 3s)
Request 2 ──[Start DB]────────► (continues) ───────► Response (after 200ms)
Request 3 ──[Start API]───────► (continues) ───────► Response (after 50ms)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All requests are handled concurrently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices That Win Hackathons &amp;amp; Clients
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Always prefer async&lt;/strong&gt; — Use &lt;code&gt;fs/promises&lt;/code&gt;, &lt;code&gt;node-fetch&lt;/code&gt;, async database drivers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid sync methods&lt;/strong&gt; in production (&lt;code&gt;Sync&lt;/code&gt;, &lt;code&gt;readFileSync&lt;/code&gt;, etc.) except during server startup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use async/await&lt;/strong&gt; over callbacks for readability (but understand Promises underneath).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle errors properly&lt;/strong&gt; — Never let unhandled promise rejections crash your app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stream large files&lt;/strong&gt; instead of reading entirely into memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offload CPU-heavy tasks&lt;/strong&gt; to Worker Threads or separate microservices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor with observability&lt;/strong&gt; — Use &lt;code&gt;clinic.js&lt;/code&gt;, Prometheus, or OpenTelemetry.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Pro Tip: Modifying Packages in &lt;code&gt;node_modules&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Sometimes a dependency uses blocking code or an old pattern. Here's how to handle it responsibly:&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;# Install the package&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;some-package
&lt;span class="c"&gt;# or&lt;/span&gt;
pnpm add some-package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Patching strategy:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use &lt;code&gt;patch-package&lt;/code&gt; (highly recommended):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; patch-package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Modify the file inside &lt;code&gt;node_modules/some-package&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npx patch-package some-package&lt;/code&gt; to create a &lt;code&gt;.patch&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Commit the patch and add &lt;code&gt;"postinstall": "patch-package"&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This ensures your async improvements survive &lt;code&gt;node_modules&lt;/code&gt; reinstalls.&lt;/p&gt;

&lt;p&gt;For quick overrides, you can also use &lt;code&gt;resolutions&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt; (pnpm/yarn) or &lt;code&gt;overrides&lt;/code&gt; (npm).&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Challenge for You
&lt;/h3&gt;

&lt;p&gt;Go audit your current project right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search for &lt;code&gt;*Sync&lt;/code&gt; methods.&lt;/li&gt;
&lt;li&gt;Replace them with async versions.&lt;/li&gt;
&lt;li&gt;Measure the difference under load (use &lt;code&gt;autocannon&lt;/code&gt; or &lt;code&gt;artillery&lt;/code&gt;).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; autocannon
npx autocannon &lt;span class="nt"&gt;-c&lt;/span&gt; 100 &lt;span class="nt"&gt;-d&lt;/span&gt; 30 http://localhost:3000/your-endpoint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Developers who master non-blocking patterns build faster, more responsive apps that scale to thousands of concurrent users — exactly what hackathon judges and clients love.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Node.js ecosystem rewards async thinkers.&lt;/strong&gt; Write non-blocking code, ship blazing-fast applications, and watch opportunities flow in.&lt;/p&gt;

&lt;p&gt;Share this with your team or fellow hackers. The chef who multitasks wins the restaurant game.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Happy coding! Drop your best async tips or war stories in the comments.&lt;/em&gt; 🔥&lt;/p&gt;




</description>
      <category>node</category>
      <category>javascript</category>
      <category>javascriptlibraries</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Handling File Uploads in Express.js with Multer: The Complete Guide (2026 Edition)</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Sat, 09 May 2026 04:52:29 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/handling-file-uploads-in-expressjs-with-multer-the-complete-guide-2026-edition-3ff7</link>
      <guid>https://dev.to/bhupeshchandrajoshi/handling-file-uploads-in-expressjs-with-multer-the-complete-guide-2026-edition-3ff7</guid>
      <description>&lt;p&gt;File uploads are a core feature in most modern web applications — whether it’s profile pictures, product images, documents, or CSV imports. Express.js doesn’t handle multipart/form-data out of the box, which is why we need &lt;strong&gt;Multer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is your one-stop, brain-friendly guide to mastering file uploads with Multer.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Do We Need Middleware for File Uploads?
&lt;/h3&gt;

&lt;p&gt;HTML forms with &lt;code&gt;enctype="multipart/form-data"&lt;/code&gt; send data differently from regular &lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt; forms.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text fields → easy&lt;/li&gt;
&lt;li&gt;Files → binary data + metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Node.js/Express &lt;code&gt;req.body&lt;/code&gt; and &lt;code&gt;req.query&lt;/code&gt; can’t parse this format natively. That’s where &lt;strong&gt;Multer&lt;/strong&gt; comes in — it parses the multipart request, extracts files and fields, and attaches them to the request object (&lt;code&gt;req.file&lt;/code&gt; / &lt;code&gt;req.files&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple Analogy&lt;/strong&gt;: Think of Multer as a helpful receptionist who opens the package (multipart request), sorts the documents (text fields) and gifts (files), and hands them to you in an organized way.&lt;/p&gt;




&lt;h3&gt;
  
  
  What is Multer?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Multer&lt;/strong&gt; is a Node.js middleware for handling &lt;code&gt;multipart/form-data&lt;/code&gt;. It’s built on top of &lt;code&gt;busboy&lt;/code&gt; (very fast) and provides a clean API for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saving files to disk&lt;/li&gt;
&lt;li&gt;Keeping files in memory&lt;/li&gt;
&lt;li&gt;Filtering files by type/size&lt;/li&gt;
&lt;li&gt;Renaming files&lt;/li&gt;
&lt;li&gt;Handling multiple files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Official npm&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/multer" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/multer&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# npm&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;multer

&lt;span class="c"&gt;# pnpm&lt;/span&gt;
pnpm add multer

&lt;span class="c"&gt;# yarn&lt;/span&gt;
yarn add multer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For TypeScript users:&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;# npm&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; @types/multer

&lt;span class="c"&gt;# pnpm / yarn similarly&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Project Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;multer-express-upload
&lt;span class="nb"&gt;cd &lt;/span&gt;multer-express-upload
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express multer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basic &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="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="s1"&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;multer&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="s1"&gt;multer&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;path&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="s1"&gt;path&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Serve static files (uploaded images)&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/uploads&lt;/span&gt;&lt;span class="dl"&gt;'&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;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uploads&lt;/span&gt;&lt;span class="dl"&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index.html&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="nx"&gt;PORT&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="s2"&gt;`Server running on http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Storage Configuration Basics
&lt;/h3&gt;

&lt;p&gt;Multer needs a &lt;code&gt;storage&lt;/code&gt; engine.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Disk Storage (Most Common)
&lt;/h4&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;storage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;multer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;diskStorage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &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;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uploads/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        &lt;span class="c1"&gt;// folder must exist&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &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;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cb&lt;/span&gt;&lt;span class="p"&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;uniqueSuffix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;E9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fieldname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;uniqueSuffix&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;originalname&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;multer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;storage&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Memory Storage (For Cloud Uploads)
&lt;/h4&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;storage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;multer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memoryStorage&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;upload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;multer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;storage&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;Tip&lt;/strong&gt;: Use &lt;code&gt;memoryStorage&lt;/code&gt; when uploading directly to AWS S3, Cloudinary, etc.&lt;/p&gt;




&lt;h3&gt;
  
  
  Handling Single File Upload
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;HTML Form&lt;/strong&gt; (&lt;code&gt;index.html&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"/upload"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt; &lt;span class="na"&gt;enctype=&lt;/span&gt;&lt;span class="s"&gt;"multipart/form-data"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"file"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"avatar"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Upload&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Route&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;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/upload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;single&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;avatar&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&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;file&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="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;400&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="s1"&gt;No file uploaded&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;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;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&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;json&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;File uploaded successfully&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;filename&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;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`/uploads/&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;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filename&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="na"&gt;size&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;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;mimetype&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;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mimetype&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;&lt;code&gt;req.file&lt;/code&gt; object contains&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fieldname&lt;/code&gt;, &lt;code&gt;originalname&lt;/code&gt;, &lt;code&gt;encoding&lt;/code&gt;, &lt;code&gt;mimetype&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;destination&lt;/code&gt;, &lt;code&gt;filename&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;size&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Handling Multiple Files
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Multiple files with same field name
&lt;/h4&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;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/upload-multiple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;photos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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="c1"&gt;// max 5 files&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="na"&gt;message&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; files uploaded`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;files&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;files&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;h4&gt;
  
  
  Multiple fields with different names
&lt;/h4&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;uploadFields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;avatar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;documents&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&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;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/upload-fields&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uploadFields&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;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;avatar&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;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;avatar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;documents&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;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;documents&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;
  
  
  File Filtering &amp;amp; Validation (Very Important)
&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;const&lt;/span&gt; &lt;span class="nx"&gt;fileFilter&lt;/span&gt; &lt;span class="o"&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;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cb&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="c1"&gt;// Allowed extensions&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;allowedTypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/jpeg|jpg|png|gif|pdf/&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;extname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;allowedTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;originalname&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&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;mimetype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;allowedTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mimetype&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;extname&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;mimetype&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="nf"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;cb&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;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Only images and PDFs are allowed!&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;multer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;// 5MB&lt;/span&gt;
  &lt;span class="na"&gt;fileFilter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fileFilter&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Handle errors gracefully:&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;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/upload&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="nx"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;single&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;avatar&lt;/span&gt;&lt;span class="dl"&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="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="o"&gt;=&amp;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="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;code&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LIMIT_FILE_SIZE&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="k"&gt;return&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;400&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="s1"&gt;File too large (max 5MB)&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="k"&gt;return&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;400&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="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="nf"&gt;next&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="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="c1"&gt;// success handler&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Multer Upload Lifecycle (Brain-Friendly Flow)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD
    A[Client sends multipart/form-data] --&amp;gt; B[Multer Middleware]
    B --&amp;gt; C{Parse Request}
    C --&amp;gt; D[Apply fileFilter]
    D --&amp;gt; E{Check Limits}
    E --&amp;gt; F[Save to storage]
    F --&amp;gt; G[Attach to req.file / req.files]
    G --&amp;gt; H[Your Route Handler]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Serving Uploaded Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Make sure this is before your routes&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/uploads&lt;/span&gt;&lt;span class="dl"&gt;'&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;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uploads&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;For production, use &lt;strong&gt;Nginx&lt;/strong&gt; or a CDN instead of serving static files through Node.js.&lt;/p&gt;




&lt;h3&gt;
  
  
  Complete Example with Folder Creation
&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;const&lt;/span&gt; &lt;span class="nx"&gt;fs&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="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Create uploads folder if not exists&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uploadDir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uploads&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;existsSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uploadDir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mkdirSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uploadDir&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;
  
  
  Best Practices &amp;amp; Pro Tips
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Always validate&lt;/strong&gt; file types and sizes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rename files&lt;/strong&gt; — never trust &lt;code&gt;originalname&lt;/code&gt; (security + collision)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use UUID&lt;/strong&gt; for filenames in production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scan files&lt;/strong&gt; for malware (ClamAV) in critical apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean up&lt;/strong&gt; temporary files on error (memory storage)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use environment variables&lt;/strong&gt; for upload paths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limit&lt;/strong&gt; upload endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compress images&lt;/strong&gt; before saving (sharp library)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Recommended Additional Packages&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;sharp uuid express-rate-limit
&lt;span class="c"&gt;# pnpm add sharp uuid express-rate-limit&lt;/span&gt;
&lt;span class="c"&gt;# yarn add sharp uuid express-rate-limit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Common Pitfalls
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Forgetting &lt;code&gt;enctype="multipart/form-data"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Not creating the &lt;code&gt;uploads&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;upload.single()&lt;/code&gt; with multiple files&lt;/li&gt;
&lt;li&gt;Serving large files directly from Express in production&lt;/li&gt;
&lt;li&gt;Not handling errors from Multer&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Advanced: Upload to Cloud Storage
&lt;/h3&gt;

&lt;p&gt;Once you’re comfortable with disk storage, move to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS S3 + Multer-S3&lt;/li&gt;
&lt;li&gt;Cloudinary&lt;/li&gt;
&lt;li&gt;Google Cloud Storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ll write separate deep-dive blogs for these.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;You now have everything you need to handle file uploads professionally in Express.js using Multer — from basics to production-ready patterns.&lt;/p&gt;

&lt;p&gt;Master Multer → you can build profile systems, e-commerce product uploads, document management, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Coding!&lt;/strong&gt; 🚀&lt;/p&gt;




&lt;h3&gt;
  
  
  References &amp;amp; Further Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Official Multer Docs: &lt;a href="https://github.com/expressjs/multer" rel="noopener noreferrer"&gt;https://github.com/expressjs/multer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Express Static Files: &lt;a href="https://expressjs.com/en/starter/static-files.html" rel="noopener noreferrer"&gt;https://expressjs.com/en/starter/static-files.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Handling Errors in Multer&lt;/li&gt;
&lt;li&gt;Image Optimization with Sharp&lt;/li&gt;
&lt;li&gt;Secure File Upload Best Practices (OWASP)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Other blogs in this Express Series&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/express-routing-mastery"&gt;Express.js Routing Mastery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/middleware-express"&gt;Middleware Deep Dive in Express&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/express-mongodb-rest-api"&gt;Building REST APIs with Express + MongoDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/express-authentication-jwt"&gt;Authentication in Express (JWT + Passport)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Share this blog&lt;/strong&gt; if it helped you! Drop your questions or your favorite upload tip in the comments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Last updated: May 2026&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Written for developers who want clean, secure, and scalable solutions.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>What is Node.js? JavaScript on the Server Explained (A Beginner-Friendly Guide)</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Sat, 09 May 2026 04:46:17 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/what-is-nodejs-javascript-on-the-server-explained-a-beginner-friendly-guide-1ip</link>
      <guid>https://dev.to/bhupeshchandrajoshi/what-is-nodejs-javascript-on-the-server-explained-a-beginner-friendly-guide-1ip</guid>
      <description>&lt;p&gt;Hey there, fellow developer! 👋 If you're just starting out or mentoring juniors, you've probably heard the buzz: &lt;em&gt;“Node.js lets you run JavaScript on the server.”&lt;/em&gt; But what does that actually mean, and why did it change web development forever?&lt;/p&gt;

&lt;p&gt;Let’s break it down in plain, brain-friendly language — like we’re chatting over coffee. No heavy internals, just the “why” and “how” that actually sticks.&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript Was Born in the Browser (The Old Days)
&lt;/h3&gt;

&lt;p&gt;Back in 1995, JavaScript was created to make websites interactive &lt;em&gt;inside the browser&lt;/em&gt;. Think buttons that react, form validations, animations — all client-side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The limitation?&lt;/strong&gt; JavaScript could &lt;em&gt;only&lt;/em&gt; run in browsers. There was no official way to run it on a server to handle databases, authentication, file uploads, or APIs.&lt;/p&gt;

&lt;p&gt;Traditional backends used languages like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP (great for dynamic pages, powers WordPress)&lt;/li&gt;
&lt;li&gt;Java (enterprise king with Spring)&lt;/li&gt;
&lt;li&gt;Python (Django/Flask)&lt;/li&gt;
&lt;li&gt;Ruby (Rails)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These had their own runtimes and ecosystems. Developers had to learn different languages for frontend (JS) and backend. Context-switching was painful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Then Came Node.js — JavaScript Escaped the Browser! 🎉
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Node.js&lt;/strong&gt; (released in 2009 by Ryan Dahl) is a &lt;strong&gt;runtime environment&lt;/strong&gt; that lets JavaScript run outside the browser — on your server, desktop, or even IoT devices.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Mind Trick to Remember&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
JavaScript = the &lt;em&gt;language&lt;/em&gt; (what you write)&lt;br&gt;&lt;br&gt;
Node.js = the &lt;em&gt;runtime&lt;/em&gt; (the engine that executes it on the server)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Just like Chrome has its own engine to run JS in the browser, Node.js brings that power to the server.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Secret Sauce: V8 Engine (High-Level View)
&lt;/h3&gt;

&lt;p&gt;Node.js uses Google’s &lt;strong&gt;V8 engine&lt;/strong&gt; — the same super-fast JS engine that powers Google Chrome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple analogy&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
V8 is like a high-performance car engine. Node.js is the full car (with wheels, steering, and features) built around that engine so you can actually drive it on the server road.&lt;/p&gt;

&lt;p&gt;V8 compiles JavaScript to machine code at lightning speed. This is why Node.js feels fast.&lt;/p&gt;
&lt;h3&gt;
  
  
  Event-Driven, Non-Blocking Architecture (The Real Superpower)
&lt;/h3&gt;

&lt;p&gt;This is the concept that made everyone fall in love with Node.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional way (blocking, like PHP/Java in old setups)&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Imagine a restaurant. One waiter (thread) takes your order, goes to the kitchen, waits until food is ready, then serves you. Other customers wait.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node.js way (non-blocking, event-driven)&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
One waiter takes your order, tells the kitchen, and immediately serves other tables. When kitchen says “order ready” (event), the waiter comes back. This uses a single thread efficiently with an &lt;strong&gt;Event Loop&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Brain-friendly mnemonic&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;"Node doesn’t wait around — it takes the order and keeps moving."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This makes Node.js excellent for I/O-heavy tasks (reading files, network calls, databases) rather than heavy CPU computations.&lt;/p&gt;
&lt;h3&gt;
  
  
  Browser JS vs Node.js — Visual Comparison
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A[User Request] --&amp;gt; B[Browser JavaScript]
    B --&amp;gt; C[DOM Manipulation]
    B --&amp;gt; D[UI Interactions]

    E[Server Request] --&amp;gt; F[Node.js]
    F --&amp;gt; G[Handle API Logic]
    F --&amp;gt; H[Database Queries]
    F --&amp;gt; I[File System]
    F --&amp;gt; J[Authentication]

    style B fill:#4285F4
    style F fill:#68A063
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Real-World Use Cases Where Node.js Shines
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;REST &amp;amp; GraphQL APIs&lt;/strong&gt; (Express, Fastify, NestJS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time apps&lt;/strong&gt; — Chat (Socket.io), collaborative tools&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microservices&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serverless&lt;/strong&gt; (Vercel, AWS Lambda)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command Line Tools&lt;/strong&gt; (like &lt;code&gt;create-react-app&lt;/code&gt;, &lt;code&gt;vite&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming services&lt;/strong&gt;, IoT, DevOps scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Big names: Netflix, LinkedIn, PayPal, Uber, NASA — all use Node.js.&lt;/p&gt;
&lt;h3&gt;
  
  
  Node.js vs Traditional Backends (Quick Comparison)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Node.js&lt;/th&gt;
&lt;th&gt;PHP/Java (Traditional)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;JavaScript (fullstack)&lt;/td&gt;
&lt;td&gt;Different languages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture&lt;/td&gt;
&lt;td&gt;Event-driven, non-blocking&lt;/td&gt;
&lt;td&gt;Often blocking (multi-thread)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning Curve&lt;/td&gt;
&lt;td&gt;Low for JS devs&lt;/td&gt;
&lt;td&gt;Higher if learning new lang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance (I/O)&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ecosystem&lt;/td&gt;
&lt;td&gt;npm — world's largest&lt;/td&gt;
&lt;td&gt;Composer/Maven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best For&lt;/td&gt;
&lt;td&gt;Real-time, APIs, startups&lt;/td&gt;
&lt;td&gt;Enterprise, heavy CPU tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why developers adopted Node.js so fast&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;one language&lt;/strong&gt; for frontend + backend (huge productivity boost)&lt;/li&gt;
&lt;li&gt;Massive &lt;strong&gt;npm&lt;/strong&gt; ecosystem (over 2+ million packages)&lt;/li&gt;
&lt;li&gt;Fast development and iteration&lt;/li&gt;
&lt;li&gt;Great community and tooling&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Pro Tip for Modern Projects: Use pnpm
&lt;/h3&gt;

&lt;p&gt;Instead of plain &lt;code&gt;npm&lt;/code&gt;, I strongly recommend &lt;strong&gt;pnpm&lt;/strong&gt; to all juniors I mentor.&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;# Install pnpm globally&lt;/span&gt;
corepack &lt;span class="nb"&gt;enable &lt;/span&gt;pnpm

&lt;span class="c"&gt;# Or&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pnpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why pnpm?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Much faster installs&lt;/li&gt;
&lt;li&gt;Saves disk space (uses symlinks)&lt;/li&gt;
&lt;li&gt;Strict dependency management (fewer bugs)&lt;/li&gt;
&lt;li&gt;Great &lt;code&gt;pnpm&lt;/code&gt; workspaces for monorepos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example &lt;code&gt;package.json&lt;/code&gt; script:&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;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nodemon index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node index.js"&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;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;h3&gt;
  
  
  Quick Start for Beginners
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Download from nodejs.org (LTS version recommended)&lt;/li&gt;
&lt;li&gt;Create &lt;code&gt;index.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;node index.js&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or use Express for your first server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm create express-app my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Final Internet Note / Mnemonic to Remember Forever
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"Browser JS = Makes websites dance&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Node.js = Makes the server think and talk"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or even shorter:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;JavaScript was trapped in the browser. Node.js set it free.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What’s next?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Try building a simple REST API with Express + MongoDB (MERN stack) or Next.js. Once you experience writing JS on both sides, you’ll never want to go back.&lt;/p&gt;

&lt;p&gt;Got questions? Drop them in the comments. I reply to juniors!&lt;/p&gt;

&lt;p&gt;Happy coding! 🚀&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Share this with a friend learning backend — it might just click for them.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Creating Routes and Handling Requests with Express (Without Melting Your Brain)</title>
      <dc:creator>Bhupesh Chandra Joshi</dc:creator>
      <pubDate>Sat, 09 May 2026 04:40:31 +0000</pubDate>
      <link>https://dev.to/bhupeshchandrajoshi/creating-routes-and-handling-requests-with-express-without-melting-your-brain-2mli</link>
      <guid>https://dev.to/bhupeshchandrajoshi/creating-routes-and-handling-requests-with-express-without-melting-your-brain-2mli</guid>
      <description>&lt;p&gt;Ever tried building a backend with raw Node.js and felt like you were assembling IKEA furniture using only your teeth?&lt;br&gt;&lt;br&gt;
Yeah. Same.&lt;/p&gt;

&lt;p&gt;Enter Express.js — the tiny but mighty web framework that hands you a box of tools, pats your head, and whispers:&lt;br&gt;&lt;br&gt;
"Relax, sweet child. I got you."&lt;/p&gt;

&lt;p&gt;Let’s walk through what Express is, why developers can’t stop adopting it like stray puppies, and how to build your first server with actual routes that do actual things.&lt;/p&gt;

&lt;p&gt;Your dopamine receptors may want to buckle up. 🚀&lt;/p&gt;

&lt;p&gt;What the Heck Is Express.js?&lt;/p&gt;

&lt;p&gt;Express.js is a minimalist, flexible web framework for Node.js. In human language:&lt;br&gt;&lt;br&gt;
It helps you build web servers without feeling like you're doing forbidden rituals with callbacks.&lt;/p&gt;

&lt;p&gt;Think of Node’s native HTTP server as a raw potato.&lt;br&gt;&lt;br&gt;
Express is that potato—&lt;br&gt;&lt;br&gt;
✨ sliced&lt;br&gt;&lt;br&gt;
✨ seasoned&lt;br&gt;&lt;br&gt;
✨ air‑fried&lt;br&gt;&lt;br&gt;
✨ and served with garlic mayo&lt;/p&gt;

&lt;p&gt;Why Express Makes Node.js Development a Whole Lot Less Spicy&lt;/p&gt;

&lt;p&gt;Node’s built-in HTTP server is powerful… but also a gremlin.&lt;/p&gt;

&lt;p&gt;With raw Node you must manually:&lt;/p&gt;

&lt;p&gt;• Parse URLs&lt;br&gt;&lt;br&gt;
• Deal with JSON bodies&lt;br&gt;&lt;br&gt;
• Handle routing yourself (oh joy)&lt;br&gt;&lt;br&gt;
• Remember that res.end() exists, or your server will just stare at you silently forever&lt;/p&gt;

&lt;p&gt;Express says:&lt;/p&gt;

&lt;p&gt;• “I’ll parse that for you.”&lt;br&gt;
• “I’ll route that for you.”&lt;br&gt;
• “I’ll JSON that for you.”&lt;br&gt;
• “I’ll hold your beverage.”&lt;/p&gt;

&lt;p&gt;Small Comparison (a.k.a. the Emotional Damage Exhibit)&lt;/p&gt;

&lt;p&gt;Raw Node.js HTTP server&lt;/p&gt;

&lt;p&gt;``js&lt;br&gt;
const http = require("http");&lt;/p&gt;

&lt;p&gt;const server = http.createServer((req, res) =&amp;gt; {&lt;br&gt;
  if (req.url === "/" &amp;amp;&amp;amp; req.method === "GET") {&lt;br&gt;
    res.writeHead(200, { "Content-Type": "text/plain" });&lt;br&gt;
    res.end("Hello from raw Node 😬");&lt;br&gt;
  } else {&lt;br&gt;
    res.writeHead(404);&lt;br&gt;
    res.end("Nope.");&lt;br&gt;
  }&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;server.listen(3000, () =&amp;gt; console.log("Server running..."));&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;Same thing with Express&lt;/p&gt;

&lt;p&gt;`js&lt;br&gt;
const express = require("express");&lt;br&gt;
const app = express();&lt;/p&gt;

&lt;p&gt;app.get("/", (req, res) =&amp;gt; {&lt;br&gt;
  res.send("Hello from Express 😎");&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;app.listen(3000);&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;The difference?&lt;br&gt;&lt;br&gt;
One looks like a therapy session waiting to happen.&lt;/p&gt;

&lt;p&gt;Creating Your First Express Server&lt;/p&gt;

&lt;p&gt;Let’s go from zero to “my server works and I’m amazing” in 10 seconds.&lt;/p&gt;

&lt;p&gt;Install Express:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
npm install express&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create a file called server.js:&lt;/p&gt;

&lt;p&gt;`js&lt;br&gt;
const express = require("express");&lt;br&gt;
const app = express();&lt;/p&gt;

&lt;p&gt;app.listen(3000, () =&amp;gt; {&lt;br&gt;
  console.log("🚀 Server is blasting off on &lt;a href="http://localhost:3000%22" rel="noopener noreferrer"&gt;http://localhost:3000"&lt;/a&gt;);&lt;br&gt;
});&lt;br&gt;
`&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;&lt;br&gt;
node server.js&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Boom. You’re officially an Express parent.&lt;/p&gt;

&lt;p&gt;Handling GET Requests (a.k.a. “Give me stuff”)&lt;/p&gt;

&lt;p&gt;GET is like the read-only friend who asks for things without contributing snacks.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;js&lt;br&gt;
app.get("/hello", (req, res) =&amp;gt; {&lt;br&gt;
  res.send("Hi! You GET me 😌");&lt;br&gt;
});&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Open your browser at &lt;a href="http://localhost:3000/hello" rel="noopener noreferrer"&gt;http://localhost:3000/hello&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Your brain: 💥 Dopamine: ☀️&lt;/p&gt;

&lt;p&gt;Handling POST Requests (a.k.a. “Here, take my data pls”)&lt;/p&gt;

&lt;p&gt;POST is how clients send data.&lt;/p&gt;

&lt;p&gt;But first: tell Express to read JSON bodies.&lt;br&gt;&lt;br&gt;
(It’s not psychic, unfortunately.)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;js&lt;br&gt;
app.use(express.json());&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now create a POST route:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;js&lt;br&gt;
app.post("/signup", (req, res) =&amp;gt; {&lt;br&gt;
  const { username } = req.body;&lt;br&gt;
  res.send(Welcome aboard, ${username}! 🎉);&lt;br&gt;
});&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you send:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;json&lt;br&gt;
{"username": "JavaScriptNinja"}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The server responds with pure, warm validation.&lt;/p&gt;

&lt;p&gt;Sending Responses (Your Server’s Love Language)&lt;/p&gt;

&lt;p&gt;Express gives multiple ways to respond:&lt;/p&gt;

&lt;p&gt;• res.send() — sends strings, objects, or buffers&lt;br&gt;
• res.json() — sends JSON&lt;br&gt;
• res.status() — sets HTTP status&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;js&lt;br&gt;
app.get("/status", (req, res) =&amp;gt; {&lt;br&gt;
  res.status(200).json({ healthy: true });&lt;br&gt;
});&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Short and sweet — unlike your last sprint.&lt;/p&gt;

&lt;p&gt;Understanding Routing (The Brain-Friendly Way)&lt;/p&gt;

&lt;p&gt;Think of routing like a giant magical vending machine:&lt;/p&gt;

&lt;p&gt;• You press a button (URL + method)&lt;br&gt;
• A specific handler pops out&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
( Request )&lt;br&gt;
     ↓&lt;br&gt;
[ Route Switchboard ]&lt;br&gt;
     ↓&lt;br&gt;
( Handler Function )&lt;br&gt;
     ↓&lt;br&gt;
( Response )&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And routing structure usually looks like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
app.get("/cats", ...)&lt;br&gt;
app.post("/cats", ...)&lt;br&gt;
app.put("/cats/:id", ...)&lt;br&gt;
app.delete("/cats/:id", ...)&lt;br&gt;
&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;Each route is a tiny worker who knows exactly what job to do.&lt;br&gt;&lt;br&gt;
No confusion. No tears. Just productivity.&lt;/p&gt;

&lt;p&gt;Final Thoughts: Express = Sanity&lt;/p&gt;

&lt;p&gt;Using Express is like switching from:&lt;/p&gt;

&lt;p&gt;• a flip phone → to a smartphone&lt;br&gt;&lt;br&gt;
• washing dishes by hand → to owning a dishwasher&lt;br&gt;&lt;br&gt;
• spaghetti code → to “this actually makes sense now”  &lt;/p&gt;

&lt;p&gt;Express handles the boring parts so you can focus on the fun: building stuff that feels magical.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
