<?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: CodeWithDhanian</title>
    <description>The latest articles on DEV Community by CodeWithDhanian (@code_2).</description>
    <link>https://dev.to/code_2</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2598648%2F680b87c2-d957-4cdd-b8c1-0009b0f55328.jpg</url>
      <title>DEV Community: CodeWithDhanian</title>
      <link>https://dev.to/code_2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/code_2"/>
    <language>en</language>
    <item>
      <title>Middleware &amp; Request-Response Pipeline</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Sat, 15 Aug 2026 06:11:11 +0000</pubDate>
      <link>https://dev.to/code_2/middleware-request-response-pipeline-kjj</link>
      <guid>https://dev.to/code_2/middleware-request-response-pipeline-kjj</guid>
      <description>&lt;p&gt;&lt;strong&gt;Middleware&lt;/strong&gt; is one of the most important concepts in backend engineering because it controls what happens &lt;strong&gt;between receiving an HTTP request and sending the HTTP response&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In frameworks such as &lt;strong&gt;Express.js&lt;/strong&gt;, middleware functions sit inside a &lt;strong&gt;request-processing pipeline&lt;/strong&gt;. Each middleware can &lt;strong&gt;inspect the request&lt;/strong&gt;, &lt;strong&gt;modify the request or response&lt;/strong&gt;, &lt;strong&gt;perform business-independent work&lt;/strong&gt;, &lt;strong&gt;terminate the request&lt;/strong&gt;, or &lt;strong&gt;pass control forward&lt;/strong&gt; with &lt;code&gt;next()&lt;/code&gt;. ([Express.js][1])&lt;/p&gt;

&lt;p&gt;A useful mental model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  |
  | HTTP Request
  v
┌─────────────────────┐
│ Request Parsing     │
└──────────┬──────────┘
           v
┌─────────────────────┐
│ Logging Middleware  │
└──────────┬──────────┘
           v
┌─────────────────────┐
│ Authentication      │
└──────────┬──────────┘
           v
┌─────────────────────┐
│ Authorization        │
└──────────┬──────────┘
           v
┌─────────────────────┐
│ Validation          │
└──────────┬──────────┘
           v
┌─────────────────────┐
│ Route Handler       │
└──────────┬──────────┘
           v
┌─────────────────────┐
│ Database / Service  │
└──────────┬──────────┘
           v
┌─────────────────────┐
│ Error Middleware    │
└──────────┬──────────┘
           v
        Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4.1 What Middleware Actually Is&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;An Express middleware function generally receives three important arguments:&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;req&lt;/code&gt;&lt;/strong&gt; — the incoming &lt;strong&gt;HTTP request&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;res&lt;/code&gt;&lt;/strong&gt; — the outgoing &lt;strong&gt;HTTP response&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;next&lt;/code&gt;&lt;/strong&gt; — function used to transfer control to the next middleware&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A minimal middleware looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;logger&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="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;originalUrl&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;Register it:&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;logger&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important operation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If middleware does not &lt;strong&gt;send a response&lt;/strong&gt;, &lt;strong&gt;end the request&lt;/strong&gt;, or call &lt;strong&gt;&lt;code&gt;next()&lt;/code&gt;&lt;/strong&gt;, the request can remain unresolved. ([Express.js][1])&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4.2 The Request-Response Lifecycle&lt;/strong&gt;
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/users
Content-Type: application/json
Authorization: Bearer TOKEN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend can process it through multiple stages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP Request
     |
     v
Node.js HTTP Server
     |
     v
Express Application
     |
     v
Global Middleware
     |
     +---- Request ID
     |
     +---- Logging
     |
     +---- JSON Parsing
     |
     +---- CORS
     |
     +---- Security
     |
     v
Router
     |
     v
Authentication
     |
     v
Authorization
     |
     v
Validation
     |
     v
Controller
     |
     v
Service
     |
     v
Database
     |
     v
Controller
     |
     v
Response Middleware
     |
     v
HTTP Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Middleware order matters.&lt;/strong&gt; Express executes middleware in the order in which it is registered. ([Express.js][2])&lt;/p&gt;

&lt;p&gt;For example:&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;authMiddleware&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;validationMiddleware&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;/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The request must pass through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;authMiddleware
      ↓
validationMiddleware
      ↓
createUser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Changing the order changes the behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4.3 Middleware Can Do Four Fundamental Things&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Execute logic&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;logger&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="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;method&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;h3&gt;
  
  
  &lt;strong&gt;2. Modify the request&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;attachRequestId&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;requestId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&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;Later code can access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;requestId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3. Modify the response&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;securityHeaders&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X-API-Version&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;4. End the request&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maintenanceMode&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="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;503&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;Service temporarily unavailable&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;There is no &lt;code&gt;next()&lt;/code&gt; because the middleware has already &lt;strong&gt;completed the request-response cycle&lt;/strong&gt;. Express documents middleware as being able to execute code, modify &lt;code&gt;req&lt;/code&gt;/&lt;code&gt;res&lt;/code&gt;, end the cycle, or call &lt;code&gt;next()&lt;/code&gt;. ([Express.js][1])&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4.4 &lt;code&gt;next()&lt;/code&gt; Is the Control Mechanism&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Think of &lt;code&gt;next()&lt;/code&gt; as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Middleware finished its job.
Continue processing this request."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&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;authenticate&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="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;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;Authentication 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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important distinction is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Continue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while:&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A common mistake is accidentally doing both:&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="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="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;Unauthorized&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can cause the pipeline to continue after a response has already been sent.&lt;/p&gt;

&lt;p&gt;Prefer:&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="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;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="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4.5 Application-Level Middleware&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Application-level middleware applies to the entire application or a broad section of it.&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="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;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Every Request
      |
      v
express.json()
      |
      v
Request Logger
      |
      v
Router
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Express provides built-in middleware such as &lt;strong&gt;&lt;code&gt;express.json()&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;express.urlencoded()&lt;/code&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;code&gt;express.static()&lt;/code&gt;&lt;/strong&gt;. ([Express.js][1])&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4.6 Router-Level Middleware&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Large applications should not put every middleware function directly into &lt;code&gt;app.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Use routers:&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.js
├── middleware/
│   ├── auth.js
│   ├── validate.js
│   └── error.js
├── routes/
│   ├── users.js
│   └── orders.js
├── controllers/
│   ├── users.js
│   └── orders.js
└── services/
    ├── users.js
    └── orders.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&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="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="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;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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;authenticate&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="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;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="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;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;authenticate&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;/&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;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;Authenticated users&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;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;p&gt;Mount it:&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userRouter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;passes through the router's authentication middleware before reaching the handler. Express supports both &lt;strong&gt;application-level&lt;/strong&gt; and &lt;strong&gt;router-level&lt;/strong&gt; middleware. ([Express.js][1])&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4.7 Authentication Middleware&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Authentication determines:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Who is making this request?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A simplified JWT middleware:&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="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="s2"&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;function&lt;/span&gt; &lt;span class="nf"&gt;authenticate&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;header&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="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;header&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="s2"&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="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;Missing authentication 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="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;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&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;payload&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;payload&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="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;Invalid or expired 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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pipeline becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
   |
   v
Authorization Header
   |
   v
Extract Token
   |
   v
Verify Signature
   |
   +---- Invalid → 401
   |
   v
req.user = payload
   |
   v
next()
   |
   v
Controller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The middleware creates a controlled boundary between &lt;strong&gt;unauthenticated HTTP traffic&lt;/strong&gt; and &lt;strong&gt;authenticated application logic&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4.8 Authorization Middleware&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Authentication answers &lt;strong&gt;who you are&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Authorization answers &lt;strong&gt;what you are allowed to do&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;requireRole&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;allowedRoles&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="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;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;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;Authentication 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="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;allowedRoles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&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;role&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;403&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;Forbidden&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use it:&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;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&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="nx"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;requireRole&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;deleteUser&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pipeline becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
   ↓
authenticate
   ↓
requireRole("admin")
   ↓
deleteUser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4.9 Validation Middleware&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Validation should happen &lt;strong&gt;before business logic&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;function&lt;/span&gt; &lt;span class="nf"&gt;validateCreateUser&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;name&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="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
    &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
    &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&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;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 request body&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;if &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;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;8&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;Password must contain at least 8 characters&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&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;router&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;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;validateCreateUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;createUser&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents the controller from becoming responsible for every HTTP-level validation rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4.10 Error-Handling Middleware&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Errors should have a &lt;strong&gt;centralized path&lt;/strong&gt; instead of every controller independently formatting errors.&lt;/p&gt;

&lt;p&gt;Express identifies error-handling middleware through its four-argument 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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;([Express.js][1])&lt;/p&gt;

&lt;p&gt;Example:&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;errorHandler&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="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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;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="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Internal server error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Register it &lt;strong&gt;after routes&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userRouter&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;/api/orders&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;orderRouter&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;errorHandler&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A typical structure is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
   ↓
Middleware
   ↓
Router
   ↓
Controller
   ↓
Service
   ↓
Error
   ↓
next(error)
   ↓
Error Handler
   ↓
HTTP Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4.11 Async Middleware&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Modern backend applications perform many asynchronous operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Database queries&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP requests&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File operations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache operations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Message queues&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;External APIs&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loadUser&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="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="nx"&gt;userService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findById&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="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="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;404&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;User not found&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;userRecord&lt;/span&gt; &lt;span class="o"&gt;=&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;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="nf"&gt;next&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important pattern is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await operation
      |
      +---- success → next()
      |
      +---- failure → next(error)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In current Express behavior, rejected promises from middleware are propagated to &lt;code&gt;next()&lt;/code&gt; automatically in Express 5, while explicitly calling &lt;code&gt;next(error)&lt;/code&gt; remains a clear pattern for asynchronous control flow. ([Express.js][2])&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4.12 Complete Backend Pipeline&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A clean production-oriented structure can look like:&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="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="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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:crypto&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;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="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;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;requestId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&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="na"&gt;requestId&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;requestId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;method&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="na"&gt;path&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;originalUrl&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;authenticate&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="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;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;Authentication 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="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="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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user-123&lt;/span&gt;&lt;span class="dl"&gt;"&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="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="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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;requireRole&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="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="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="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;role&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;role&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;403&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;Forbidden&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="p"&gt;}&lt;/span&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;name&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="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;name&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&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="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;name and email are 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;/api/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;requireRole&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;validateUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="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="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;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&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="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="nx"&gt;name&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;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="nx"&gt;email&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;201&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="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="nf"&gt;next&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="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="na"&gt;requestId&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;requestId&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="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;Internal server error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;requestId&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;requestId&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="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;Server running on port 3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The complete execution path is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/users
       |
       v
express.json()
       |
       v
Request ID Middleware
       |
       v
Authentication
       |
       v
Authorization
       |
       v
Validation
       |
       v
Route Handler
       |
       v
Business Logic
       |
       v
Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If something fails:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Any Middleware / Controller
          |
          v
     next(error)
          |
          v
   Error Middleware
          |
          v
    HTTP Error Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4.13 Middleware Composition&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Middleware becomes powerful when small functions are &lt;strong&gt;composed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of one enormous function:&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;everything&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;// authentication&lt;/span&gt;
  &lt;span class="c1"&gt;// authorization&lt;/span&gt;
  &lt;span class="c1"&gt;// validation&lt;/span&gt;
  &lt;span class="c1"&gt;// logging&lt;/span&gt;
  &lt;span class="c1"&gt;// caching&lt;/span&gt;
  &lt;span class="c1"&gt;// rate limiting&lt;/span&gt;
  &lt;span class="c1"&gt;// business logic&lt;/span&gt;
  &lt;span class="c1"&gt;// error handling&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefer:&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;router&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;/orders&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;requestLogger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;rateLimiter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;requireRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;customer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;validateOrder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;createOrder&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a readable &lt;strong&gt;pipeline of responsibilities&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each middleware should ideally have &lt;strong&gt;one clear responsibility&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4.14 Route-Specific vs Global Middleware&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Global middleware:&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;requestLogger&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is appropriate when almost every request needs the behavior.&lt;/p&gt;

&lt;p&gt;Route-specific middleware:&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="s2"&gt;/payments&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;requireRole&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;processPayment&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is appropriate when the behavior only applies to particular endpoints.&lt;/p&gt;

&lt;p&gt;A practical structure is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Global
├── JSON parsing
├── Request ID
├── CORS
├── Security headers
└── General logging

Router
├── Authentication
├── Authorization
├── Validation
└── Resource-specific rules

Controller
└── Business operation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4.15 The Most Important Middleware Rules&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Middleware order is execution order.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;next()&lt;/code&gt; transfers control forward.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;next(error)&lt;/code&gt; transfers control to error-handling middleware.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sending a response should normally terminate the current path.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication should occur before protected business logic.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authorization should occur after authentication.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation should happen before expensive business operations.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error middleware should be centralized.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Middleware should remain focused and composable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business logic should not be buried inside generic middleware.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A well-designed request-response pipeline makes the backend easier to &lt;strong&gt;secure&lt;/strong&gt;, &lt;strong&gt;test&lt;/strong&gt;, &lt;strong&gt;debug&lt;/strong&gt;, &lt;strong&gt;observe&lt;/strong&gt;, and &lt;strong&gt;maintain&lt;/strong&gt;. Express's middleware model is explicitly built around this ordered chain of functions that can modify requests and responses, terminate processing, or delegate to subsequent middleware. ([Express.js][1])&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend Engineering Ebook
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Grab the Backend Engineering ebook:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://codewithdhanian.gumroad.com/l/ungqng" rel="noopener noreferrer"&gt;https://codewithdhanian.gumroad.com/l/ungqng&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9z3buvvoos2cj71h1nda.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9z3buvvoos2cj71h1nda.png" alt="Middleware &amp;amp; Request-Response Pipeline&lt;br&gt;
" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
    </item>
    <item>
      <title>Authentication &amp; Authorization (JWT, OAuth2, Sessions)</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Sat, 15 Aug 2026 05:38:54 +0000</pubDate>
      <link>https://dev.to/code_2/authentication-authorization-jwt-oauth2-sessions-1nc5</link>
      <guid>https://dev.to/code_2/authentication-authorization-jwt-oauth2-sessions-1nc5</guid>
      <description>&lt;p&gt;&lt;strong&gt;Authentication&lt;/strong&gt; and &lt;strong&gt;authorization&lt;/strong&gt; are the security foundation of a backend application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication (AuthN)&lt;/strong&gt; answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Who are you?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Authorization (AuthZ)&lt;/strong&gt; answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What are you allowed to do?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A production backend usually combines &lt;strong&gt;password authentication&lt;/strong&gt;, &lt;strong&gt;sessions or tokens&lt;/strong&gt;, &lt;strong&gt;OAuth 2.0 / OpenID Connect&lt;/strong&gt;, &lt;strong&gt;role-based authorization&lt;/strong&gt;, &lt;strong&gt;secure cookies&lt;/strong&gt;, &lt;strong&gt;MFA&lt;/strong&gt;, and &lt;strong&gt;audit logging&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A secure design should also treat &lt;strong&gt;authentication&lt;/strong&gt;, &lt;strong&gt;session management&lt;/strong&gt;, and &lt;strong&gt;authorization&lt;/strong&gt; as separate responsibilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Authentication vs Authorization
&lt;/h2&gt;

&lt;p&gt;Consider an API endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;DELETE /api/users/42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend must answer two different questions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authentication
    ↓
Is this request associated with a valid authenticated user?
    ↓
Authorization
    ↓
Does that authenticated user have permission to delete user 42?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A valid login does &lt;strong&gt;not&lt;/strong&gt; automatically grant permission to perform every operation.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: alice@example.com
Authenticated: YES
Role: USER

GET /api/profile
→ ALLOWED

DELETE /api/users/42
→ DENIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An administrator might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: admin@example.com
Authenticated: YES
Role: ADMIN

GET /api/profile
→ ALLOWED

DELETE /api/users/42
→ ALLOWED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation prevents a common security mistake: treating &lt;strong&gt;identity&lt;/strong&gt; as &lt;strong&gt;permission&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Complete Authentication Architecture
&lt;/h2&gt;

&lt;p&gt;A typical backend authentication system looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌──────────────────────┐
                    │      Browser / App   │
                    └──────────┬───────────┘
                               │
                         HTTPS Request
                               │
                               ▼
                    ┌──────────────────────┐
                    │    API Gateway /     │
                    │    Load Balancer     │
                    └──────────┬───────────┘
                               │
                               ▼
                    ┌──────────────────────┐
                    │ Authentication Layer │
                    │                      │
                    │ Session / JWT / OAuth│
                    └──────────┬───────────┘
                               │
                    Authenticated Identity
                               │
                               ▼
                    ┌──────────────────────┐
                    │ Authorization Layer  │
                    │                      │
                    │ RBAC / ABAC / Scopes │
                    └──────────┬───────────┘
                               │
                         Authorized Request
                               │
                               ▼
                    ┌──────────────────────┐
                    │ Application Services │
                    └──────────┬───────────┘
                               │
                               ▼
                    ┌──────────────────────┐
                    │ PostgreSQL / Redis   │
                    └──────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;client should never be trusted&lt;/strong&gt; to determine whether a request is authorized. The backend must enforce authorization on protected operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Password Authentication
&lt;/h2&gt;

&lt;p&gt;A traditional authentication flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Registration
    ↓
User submits email + password
    ↓
Validate input
    ↓
Hash password
    ↓
Store password hash
    ↓
Login
    ↓
Find user
    ↓
Verify password against hash
    ↓
Create session/token
    ↓
Return authenticated response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Never store:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;password = "MyPassword123"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store a strong &lt;strong&gt;password hash&lt;/strong&gt; instead.&lt;/p&gt;

&lt;p&gt;Modern password hashing should use a dedicated password-hashing algorithm such as &lt;strong&gt;Argon2id&lt;/strong&gt;, &lt;strong&gt;bcrypt&lt;/strong&gt;, or another appropriately configured password hashing mechanism. OWASP recommends secure password storage rather than reversible encryption or plaintext storage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node.js Example
&lt;/h3&gt;



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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&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="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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;argon2&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;argon2&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;jwt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&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;cookieParser&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cookie-parser&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;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="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;cookieParser&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;users&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;Map&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;/register&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="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 are 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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&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="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;409&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;User already exists&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;passwordHash&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;argon2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hash&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;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&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="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;passwordHash&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USER&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="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;201&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;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="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;Server running on port 3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important distinction is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Plain password
     ↓
Argon2id
     ↓
Password hash
     ↓
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;During login, the server does not decrypt a password. It verifies whether the submitted password matches the stored hash.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. JWT Authentication
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;JSON Web Token (JWT)&lt;/strong&gt; is a compact token format commonly used to represent claims between systems.&lt;/p&gt;

&lt;p&gt;A JWT normally contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HEADER.PAYLOAD.SIGNATURE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJzdWIiOiIxMjMiLCJyb2xlIjoiVVNFUiJ9
.
signature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The payload can contain claims such as:&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;"sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USER"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iss"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"aud"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"web-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1786780000&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;p&gt;Important JWT claims include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;sub&lt;/strong&gt; — subject or user identifier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iss&lt;/strong&gt; — token issuer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;aud&lt;/strong&gt; — intended audience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;exp&lt;/strong&gt; — expiration time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iat&lt;/strong&gt; — issued-at time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;scope&lt;/strong&gt; — permitted OAuth scopes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A JWT is &lt;strong&gt;signed&lt;/strong&gt;, not automatically &lt;strong&gt;encrypted&lt;/strong&gt;. Therefore, sensitive secrets should not be placed inside its payload.&lt;/p&gt;

&lt;h3&gt;
  
  
  JWT Authentication Flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  │
  │ POST /login
  │ email + password
  ▼
Backend
  │
  ├── Find user
  ├── Verify password
  └── Issue access token
  │
  ▼
Client
  │
  │ Authorization: Bearer &amp;lt;token&amp;gt;
  ▼
Authentication Middleware
  │
  ├── Verify signature
  ├── Validate expiration
  ├── Validate issuer
  └── Validate audience
  │
  ▼
Authorization Middleware
  │
  ├── Check role
  └── Check permissions
  │
  ▼
Protected Controller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Complete JWT Middleware
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&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="s2"&gt;jsonwebtoken&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;JWT_SECRET&lt;/span&gt; &lt;span class="o"&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;authenticate&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;authorization&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="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;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="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;Authentication 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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;scheme&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="o"&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scheme&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bearer&lt;/span&gt;&lt;span class="dl"&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;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;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 authorization header&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;payload&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;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;issuer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;api.example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;web-app&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;user&lt;/span&gt; &lt;span class="o"&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;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sub&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;payload&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="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="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;Invalid or expired 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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The middleware converts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP Authorization Header
            ↓
Token Verification
            ↓
Validated Identity
            ↓
req.user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;strong&gt;Bearer token&lt;/strong&gt; must be protected carefully because possession of the token is generally sufficient to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. JWT Access Tokens and Refresh Tokens
&lt;/h2&gt;

&lt;p&gt;A common architecture separates &lt;strong&gt;short-lived access tokens&lt;/strong&gt; from &lt;strong&gt;long-lived refresh tokens&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;Login
  │
  ├──────────────► Access Token
  │                 Short lifetime
  │                 Used for APIs
  │
  └──────────────► Refresh Token
                    Longer lifetime
                    Used to obtain new access tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Access Token
    ↓
15 minutes

Refresh Token
    ↓
Days / weeks depending on security requirements
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the access token expires:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  │
  │ refresh token
  ▼
Backend
  │
  ├── Validate refresh token
  ├── Check revocation/session state
  └── Rotate refresh token
  │
  ▼
New access token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For browser applications, authentication credentials should generally &lt;strong&gt;not&lt;/strong&gt; be stored in &lt;code&gt;localStorage&lt;/code&gt; or &lt;code&gt;sessionStorage&lt;/code&gt;, because JavaScript running in the origin can access them. OWASP recommends appropriately protected cookies or architectures such as a &lt;strong&gt;Backend-for-Frontend (BFF)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Secure Cookie Configuration
&lt;/h2&gt;

&lt;p&gt;A session or refresh token stored in a cookie should use appropriate security attributes:&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;refresh_token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;refreshToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;httpOnly&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="na"&gt;secure&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="na"&gt;sameSite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lax&lt;/span&gt;&lt;span class="dl"&gt;"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxAge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important attributes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HttpOnly
    ↓
JavaScript cannot directly read the cookie

Secure
    ↓
Cookie is sent only over HTTPS

SameSite
    ↓
Controls cross-site cookie transmission

Path
    ↓
Limits where the cookie is sent

Max-Age
    ↓
Controls cookie lifetime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cookie-based authentication must also consider &lt;strong&gt;CSRF&lt;/strong&gt; protection, particularly when cookies are automatically attached to cross-site requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Server-Side Sessions
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;session-based authentication&lt;/strong&gt; system stores authentication state on the server.&lt;/p&gt;

&lt;p&gt;The browser receives only an opaque session identifier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   │
   │ session_id=abc123
   ▼
Backend
   │
   ▼
Session Store
   │
   └── abc123
        ├── userId: 42
        ├── role: USER
        └── expiresAt: ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The session identifier should be &lt;strong&gt;random&lt;/strong&gt;, &lt;strong&gt;unpredictable&lt;/strong&gt;, and contain no sensitive user information. OWASP recommends strong server-generated session identifiers and careful lifecycle management.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redis Session Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&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;sessionId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hex&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;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&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="na"&gt;expiresAt&lt;/span&gt;&lt;span class="p"&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="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;session&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;The architecture becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  │
  │ Cookie: session_id
  ▼
API
  │
  ▼
Redis
  │
  └── session_id → user identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes &lt;strong&gt;logout&lt;/strong&gt;, &lt;strong&gt;session revocation&lt;/strong&gt;, and &lt;strong&gt;server-side session invalidation&lt;/strong&gt; straightforward.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. OAuth 2.0
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;OAuth 2.0&lt;/strong&gt; is primarily an &lt;strong&gt;authorization framework&lt;/strong&gt;, not a password-login protocol.&lt;/p&gt;

&lt;p&gt;It allows a client application to obtain limited access to protected resources without receiving the resource owner's password.&lt;/p&gt;

&lt;p&gt;The important roles are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resource Owner
      │
      ▼
Authorization Server
      │
      ▼
Client Application
      │
      ▼
Resource Server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
 │
 │ "Allow application to access profile"
 ▼
Google Authorization Server
 │
 │ authorization code
 ▼
Application
 │
 │ exchange code
 ▼
Access Token
 │
 ▼
Protected API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For modern applications, the &lt;strong&gt;Authorization Code flow with PKCE&lt;/strong&gt; is the standard pattern to understand, especially for public clients where a client secret cannot safely be kept confidential.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. OAuth 2.0 Authorization Code + PKCE
&lt;/h2&gt;

&lt;p&gt;The architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────┐
│   Client   │
└─────┬──────┘
      │
      │ 1. Generate code_verifier
      │
      │ 2. Create code_challenge
      ▼
┌─────────────────────┐
│ Authorization       │
│ Server              │
└──────────┬──────────┘
           │
           │ 3. User authenticates
           │
           │ 4. User grants access
           ▼
      Authorization Code
           │
           ▼
┌──────────┴──────────┐
│ Client              │
│                     │
│ code + verifier     │
└──────────┬──────────┘
           │
           │ 5. Token request
           ▼
┌─────────────────────┐
│ Authorization       │
│ Server              │
└──────────┬──────────┘
           │
           │ 6. Access Token
           ▼
┌─────────────────────┐
│ Resource Server     │
└─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PKCE binds the authorization-code exchange to the client instance that initiated the flow.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;code_verifier
      │
      ▼
SHA-256
      │
      ▼
code_challenge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The client sends the &lt;strong&gt;code_challenge&lt;/strong&gt; during authorization and later sends the original &lt;strong&gt;code_verifier&lt;/strong&gt; during token exchange.&lt;/p&gt;

&lt;p&gt;The authorization server verifies that they match.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. OAuth 2.0 Scopes
&lt;/h2&gt;

&lt;p&gt;OAuth permissions should be expressed using narrow &lt;strong&gt;scopes&lt;/strong&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;access = everything
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;profile:read
orders:read
orders:write
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer ACCESS_TOKEN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend validates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Token valid?
      ↓
Scope present?
      ↓
orders:write
      ↓
Allow operation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A token with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scope = "orders:read"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;should not be accepted for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;DELETE /orders/123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;because deletion requires a stronger permission such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;orders:delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  11. OpenID Connect
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;OAuth 2.0&lt;/strong&gt; provides authorization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenID Connect (OIDC)&lt;/strong&gt; adds an identity layer on top of OAuth 2.0.&lt;/p&gt;

&lt;p&gt;The conceptual difference is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OAuth 2.0
    ↓
"What can this application access?"

OpenID Connect
    ↓
"Who authenticated this user?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OIDC commonly introduces an &lt;strong&gt;ID Token&lt;/strong&gt;, which contains identity-related claims intended for the client.&lt;/p&gt;

&lt;p&gt;A backend integrating with an identity provider should validate tokens according to the provider's documented issuer, audience, signature, expiration, and other required claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Authorization with RBAC
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Role-Based Access Control (RBAC)&lt;/strong&gt; assigns permissions through roles.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;USER
 ├── profile:read
 └── order:create

EDITOR
 ├── profile:read
 ├── article:create
 └── article:update

ADMIN
 ├── user:read
 ├── user:update
 ├── user:delete
 └── system:manage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Authorization Middleware
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;authorize&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;allowedRoles&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="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;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;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;Authentication 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="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;allowedRoles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&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;role&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;403&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;Forbidden&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usage:&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="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/users/:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;authorize&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;deleteUser&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pipeline becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
   ↓
authenticate()
   ↓
Identity established
   ↓
authorize("ADMIN")
   ↓
Permission verified
   ↓
deleteUser()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;401 Unauthorized&lt;/strong&gt; generally means the request lacks valid authentication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;403 Forbidden&lt;/strong&gt; means the server understands the identity but refuses the requested operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Resource-Level Authorization
&lt;/h2&gt;

&lt;p&gt;Checking only the user's role is not always sufficient.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/orders/500
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user may have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;role = USER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but the backend must additionally verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Does order 500 belong to this user?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Correct:&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;order&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="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findUnique&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;where&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;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="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;order&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;404&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;Order not found&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&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;role&lt;/span&gt; &lt;span class="o"&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="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;403&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;Forbidden&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;This protects against &lt;strong&gt;broken object-level authorization&lt;/strong&gt;, where an authenticated user attempts to access another user's resource by changing an identifier.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. RBAC vs ABAC
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RBAC&lt;/strong&gt; evaluates roles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;role = ADMIN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Attribute-Based Access Control (ABAC)&lt;/strong&gt; evaluates multiple attributes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user.department
resource.owner
resource.classification
request.time
request.location
operation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALLOW

IF
    user.role = MANAGER
AND
    user.department = resource.department
AND
    operation = "READ"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This becomes valuable in large systems where simple roles are insufficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. Authentication Middleware Structure
&lt;/h2&gt;

&lt;p&gt;A production backend can separate security responsibilities into layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP Request
     │
     ▼
Rate Limiting
     │
     ▼
Authentication
     │
     ▼
Identity Context
     │
     ▼
Authorization
     │
     ▼
Validation
     │
     ▼
Business Logic
     │
     ▼
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A clean project structure might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── auth/
│   ├── auth.controller.js
│   ├── auth.service.js
│   ├── auth.middleware.js
│   ├── token.service.js
│   ├── password.service.js
│   └── authorization.js
│
├── users/
│   ├── user.controller.js
│   ├── user.service.js
│   └── user.repository.js
│
├── middleware/
│   ├── rateLimit.js
│   ├── validation.js
│   └── errorHandler.js
│
├── routes/
│   ├── auth.routes.js
│   └── user.routes.js
│
├── database/
│   └── client.js
│
└── server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents authentication logic from becoming mixed into every controller.&lt;/p&gt;

&lt;h2&gt;
  
  
  16. Complete Protected API Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&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="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="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="s2"&gt;jsonwebtoken&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;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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;JWT_SECRET&lt;/span&gt; &lt;span class="o"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;authenticate&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;header&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="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;header&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;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;Missing Authorization header&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;scheme&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="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;header&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scheme&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bearer&lt;/span&gt;&lt;span class="dl"&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;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;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 Authorization header&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;payload&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;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;issuer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;api.example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;web-app&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;user&lt;/span&gt; &lt;span class="o"&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;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sub&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;payload&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="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="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;Invalid or expired access 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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;authorize&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;roles&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="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;roles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&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;role&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;403&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;Insufficient permissions&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="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/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;authenticate&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;userId&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;id&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;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;role&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="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/users/:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;authorize&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="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="c1"&gt;// Delete user from database here.&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 deleted&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;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="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;API running on port 3000&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;The important security boundary is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;authenticate()
      ↓
WHO IS THE USER?
      ↓
authorize()
      ↓
WHAT MAY THE USER DO?
      ↓
controller
      ↓
business operation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  17. Multi-Factor Authentication
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Multi-Factor Authentication (MFA)&lt;/strong&gt; combines independent authentication factors.&lt;/p&gt;

&lt;p&gt;Common factors include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Something you know
    → Password

Something you have
    → Security key / authenticator device

Something you are
    → Biometric characteristic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A stronger login might therefore become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Email + Password
       ↓
Password Verification
       ↓
MFA Challenge
       ↓
MFA Verification
       ↓
Authenticated Session
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MFA is especially important for &lt;strong&gt;administrative accounts&lt;/strong&gt;, &lt;strong&gt;financial operations&lt;/strong&gt;, &lt;strong&gt;account recovery&lt;/strong&gt;, and other high-impact actions. OWASP recommends stronger authentication and re-authentication for sensitive operations and risk events.&lt;/p&gt;

&lt;h2&gt;
  
  
  18. Session Lifecycle
&lt;/h2&gt;

&lt;p&gt;Authentication is not complete when a user logs in.&lt;/p&gt;

&lt;p&gt;A secure session has a lifecycle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE
  ↓
AUTHENTICATED
  ↓
ACTIVE
  ↓
RENEWED
  ↓
EXPIRED / REVOKED
  ↓
DESTROYED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important events include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;login
logout
session_created
session_renewed
session_expired
session_revoked
password_changed
MFA_enabled
MFA_failed
authorization_denied
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Session identifiers should be regenerated when appropriate, particularly across authentication state transitions, to reduce &lt;strong&gt;session fixation&lt;/strong&gt; risks.&lt;/p&gt;

&lt;h2&gt;
  
  
  19. Logout and Token Revocation
&lt;/h2&gt;

&lt;p&gt;With server-side sessions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /logout
     ↓
Destroy session
     ↓
Clear cookie
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With refresh-token systems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /logout
     ↓
Revoke refresh token
     ↓
Clear authentication cookie
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple cookie cleanup:&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clearCookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;refresh_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="na"&gt;httpOnly&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="na"&gt;secure&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="na"&gt;sameSite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lax&lt;/span&gt;&lt;span class="dl"&gt;"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/auth&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;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;204&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For high-security systems, maintain server-side &lt;strong&gt;refresh-token/session state&lt;/strong&gt; so stolen credentials can be revoked before their natural expiration.&lt;/p&gt;

&lt;h2&gt;
  
  
  20. Authentication Security Controls
&lt;/h2&gt;

&lt;p&gt;A production authentication system should include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTPS / TLS
    +
Secure password hashing
    +
MFA
    +
Rate limiting
    +
Credential stuffing protection
    +
Account recovery protection
    +
Secure session management
    +
Short-lived access tokens
    +
Refresh-token rotation
    +
Token/session revocation
    +
Authorization checks
    +
Audit logging
    +
Re-authentication for sensitive operations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authentication endpoints should also avoid revealing whether an account exists.&lt;/p&gt;

&lt;p&gt;Instead of:&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;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Email does not exist"&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;p&gt;prefer a generic response such as:&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;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invalid email or password"&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;p&gt;This reduces &lt;strong&gt;user enumeration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Authentication systems should also log security-relevant events while avoiding passwords, access tokens, refresh tokens, and other secrets in logs. OWASP specifically recommends monitoring the lifecycle of sessions and authentication-related events.&lt;/p&gt;

&lt;h2&gt;
  
  
  21. Authentication Decision Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         REQUEST
                            │
                            ▼
                    Is HTTPS enabled?
                       │          │
                      NO         YES
                       │          │
                    REJECT        ▼
                              Authenticate
                                   │
                          ┌────────┴────────┐
                          │                 │
                       INVALID            VALID
                          │                 │
                       401                  ▼
                                      Authorize
                                          │
                                 ┌────────┴────────┐
                                 │                 │
                              DENIED             ALLOWED
                                 │                 │
                                403                 ▼
                                                  API
                                                  │
                                                  ▼
                                               Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core security model is therefore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IDENTITY
   ↓
AUTHENTICATION
   ↓
SESSION / TOKEN
   ↓
AUTHORIZATION
   ↓
PERMISSION
   ↓
RESOURCE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://codewithdhanian.gumroad.com/l/ungqng?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Grab the Backend Engineering ebook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgp4lpft2xdoaqjd5btai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgp4lpft2xdoaqjd5btai.png" alt="Authentication &amp;amp; Authorization (JWT, OAuth2, Sessions)" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
    </item>
    <item>
      <title>CRUD Operations with a Relational Database (SQL)</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Thu, 13 Aug 2026 13:21:04 +0000</pubDate>
      <link>https://dev.to/code_2/crud-operations-with-a-relational-database-sql-3hbk</link>
      <guid>https://dev.to/code_2/crud-operations-with-a-relational-database-sql-3hbk</guid>
      <description>&lt;p&gt;&lt;strong&gt;CRUD&lt;/strong&gt; stands for &lt;strong&gt;Create&lt;/strong&gt;, &lt;strong&gt;Read&lt;/strong&gt;, &lt;strong&gt;Update&lt;/strong&gt;, and &lt;strong&gt;Delete&lt;/strong&gt;—the four fundamental operations performed on data in almost every backend application. Whether building an &lt;strong&gt;e-commerce platform&lt;/strong&gt;, &lt;strong&gt;banking system&lt;/strong&gt;, &lt;strong&gt;hospital management system&lt;/strong&gt;, &lt;strong&gt;social media application&lt;/strong&gt;, or &lt;strong&gt;inventory management system&lt;/strong&gt;, every backend revolves around storing, retrieving, modifying, and removing structured data efficiently.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Relational Database Management System (RDBMS)&lt;/strong&gt; stores information inside &lt;strong&gt;tables&lt;/strong&gt;, where data is organized into &lt;strong&gt;rows&lt;/strong&gt; and &lt;strong&gt;columns&lt;/strong&gt;. Relationships between tables are established using &lt;strong&gt;Primary Keys&lt;/strong&gt; and &lt;strong&gt;Foreign Keys&lt;/strong&gt;, allowing complex applications to maintain &lt;strong&gt;data consistency&lt;/strong&gt;, &lt;strong&gt;integrity&lt;/strong&gt;, and &lt;strong&gt;normalization&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Core CRUD Operations&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. CREATE — Inserting New Records&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Create&lt;/strong&gt; operation inserts new information into a database.&lt;/p&gt;

&lt;p&gt;Example &lt;strong&gt;Users&lt;/strong&gt; table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;id&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;name&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;email&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:alice@example.com"&gt;alice@example.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Adding another user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'John Doe'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'john@example.com'&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;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;INSERT INTO&lt;/strong&gt; specifies the target table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;(name, email)&lt;/strong&gt; lists the columns receiving values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VALUES&lt;/strong&gt; contains the actual data.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;id&lt;/strong&gt; is usually generated automatically using &lt;strong&gt;AUTO_INCREMENT&lt;/strong&gt;, &lt;strong&gt;SERIAL&lt;/strong&gt;, or &lt;strong&gt;IDENTITY&lt;/strong&gt; depending on the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. READ — Retrieving Data&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Read&lt;/strong&gt; operation fetches stored information.&lt;/p&gt;

&lt;p&gt;Retrieve every user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retrieve only specific columns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retrieve a single user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retrieve users sorted alphabetically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Limit returned rows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Important SQL keywords&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SELECT&lt;/strong&gt; chooses columns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FROM&lt;/strong&gt; specifies the table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WHERE&lt;/strong&gt; filters records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ORDER BY&lt;/strong&gt; sorts results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LIMIT&lt;/strong&gt; restricts the number of returned rows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. UPDATE — Modifying Existing Data&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Update&lt;/strong&gt; operation changes existing records.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'newemail@example.com'&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&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;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UPDATE&lt;/strong&gt; specifies the table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SET&lt;/strong&gt; assigns new values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WHERE&lt;/strong&gt; identifies which row to modify.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without a &lt;strong&gt;WHERE&lt;/strong&gt; clause:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'changed@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every row in the table would be updated, making &lt;strong&gt;WHERE&lt;/strong&gt; one of the most important clauses in SQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. DELETE — Removing Records&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Delete a specific record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Delete every record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Completely remove the table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands are very different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DELETE&lt;/strong&gt; removes rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DROP TABLE&lt;/strong&gt; removes the entire table structure and its data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Complete Database Structure&lt;/strong&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database
│
├── users
│   ├── id (Primary Key)
│   ├── name
│   ├── email
│   └── created_at
│
├── products
│   ├── id (Primary Key)
│   ├── name
│   ├── price
│   └── stock
│
└── orders
    ├── id (Primary Key)
    ├── user_id (Foreign Key)
    ├── product_id (Foreign Key)
    ├── quantity
    └── order_date
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;users.id&lt;/strong&gt; uniquely identifies every user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;products.id&lt;/strong&gt; uniquely identifies every product.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;orders.user_id&lt;/strong&gt; references &lt;strong&gt;users.id&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;orders.product_id&lt;/strong&gt; references &lt;strong&gt;products.id&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This relationship prevents duplicate information and keeps data consistent across multiple tables.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Creating Tables&lt;/strong&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&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;Column breakdown&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;INT&lt;/strong&gt; stores whole numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PRIMARY KEY&lt;/strong&gt; uniquely identifies each row.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AUTO_INCREMENT&lt;/strong&gt; automatically generates IDs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VARCHAR(100)&lt;/strong&gt; stores variable-length text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NOT NULL&lt;/strong&gt; requires a value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UNIQUE&lt;/strong&gt; prevents duplicate emails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TIMESTAMP&lt;/strong&gt; records creation time automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Typical Backend CRUD Flow&lt;/strong&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
   │
   ▼
HTTP Request
   │
   ▼
Backend API
   │
   ▼
Validation
   │
   ▼
Business Logic
   │
   ▼
SQL Query
   │
   ▼
Relational Database
   │
   ▼
Query Result
   │
   ▼
Backend Response
   │
   ▼
Client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each request follows this sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Client&lt;/strong&gt; sends an HTTP request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend API&lt;/strong&gt; receives it.&lt;/li&gt;
&lt;li&gt;Input is &lt;strong&gt;validated&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business logic&lt;/strong&gt; determines what should happen.&lt;/li&gt;
&lt;li&gt;SQL performs the required &lt;strong&gt;CRUD&lt;/strong&gt; operation.&lt;/li&gt;
&lt;li&gt;Database executes the query.&lt;/li&gt;
&lt;li&gt;Results are returned.&lt;/li&gt;
&lt;li&gt;Backend formats the response as &lt;strong&gt;JSON&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Client displays the updated information.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Example CRUD API (Node.js + Express)&lt;/strong&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&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="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="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="kd"&gt;const&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="c1"&gt;// CREATE&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;/users&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;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&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;body&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;201&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;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="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// READ&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;/users&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;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// UPDATE&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;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&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="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;users&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="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="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;users&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="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// DELETE&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&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="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;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;splice&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="mi"&gt;1&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;204&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="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;This example demonstrates the four CRUD endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;POST /users&lt;/strong&gt; creates a new resource.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GET /users&lt;/strong&gt; retrieves resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PUT /users/:id&lt;/strong&gt; updates an existing resource.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DELETE /users/:id&lt;/strong&gt; removes a resource.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In production, the &lt;strong&gt;users&lt;/strong&gt; array would be replaced by SQL queries against a relational database.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Best Practices&lt;/strong&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always validate&lt;/strong&gt; incoming data before executing SQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Primary Keys&lt;/strong&gt; to uniquely identify records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforce Foreign Keys&lt;/strong&gt; to maintain relationships.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use transactions&lt;/strong&gt; when multiple related operations must either all succeed or all fail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid &lt;code&gt;SELECT *&lt;/code&gt;&lt;/strong&gt; when only specific columns are required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always include &lt;code&gt;WHERE&lt;/code&gt;&lt;/strong&gt; when updating or deleting individual records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parameterize queries&lt;/strong&gt; to prevent &lt;strong&gt;SQL Injection&lt;/strong&gt; attacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create indexes&lt;/strong&gt; on frequently searched columns to improve query performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normalize tables&lt;/strong&gt; to eliminate redundant data while preserving consistency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Backend Engineering eBook
&lt;/h2&gt;

&lt;p&gt;Build a stronger foundation in backend development with the complete &lt;strong&gt;Backend Engineering eBook&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://codewithdhanian.gumroad.com/l/ungqng" rel="noopener noreferrer"&gt;https://codewithdhanian.gumroad.com/l/ungqng&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsqct32mayhyi2wpyifbc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsqct32mayhyi2wpyifbc.png" alt="CRUD and SQL Database Cheat Sheet" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
    </item>
    <item>
      <title>Learn HTTP &amp; RESTful API Design</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Thu, 13 Aug 2026 13:05:28 +0000</pubDate>
      <link>https://dev.to/code_2/learn-http-restful-api-design-5gb0</link>
      <guid>https://dev.to/code_2/learn-http-restful-api-design-5gb0</guid>
      <description>&lt;p&gt;&lt;strong&gt;HTTP (Hypertext Transfer Protocol)&lt;/strong&gt; is the &lt;strong&gt;application-layer communication protocol&lt;/strong&gt; that allows &lt;strong&gt;clients&lt;/strong&gt; and &lt;strong&gt;servers&lt;/strong&gt; to exchange information across a network. Every modern &lt;strong&gt;web application&lt;/strong&gt;, &lt;strong&gt;mobile application&lt;/strong&gt;, &lt;strong&gt;backend service&lt;/strong&gt;, &lt;strong&gt;microservice&lt;/strong&gt;, and &lt;strong&gt;cloud platform&lt;/strong&gt; relies on HTTP to send &lt;strong&gt;requests&lt;/strong&gt; and receive &lt;strong&gt;responses&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;RESTful API (Representational State Transfer Application Programming Interface)&lt;/strong&gt; is a collection of &lt;strong&gt;HTTP endpoints&lt;/strong&gt; that expose &lt;strong&gt;resources&lt;/strong&gt; using predictable &lt;strong&gt;URLs&lt;/strong&gt;, standard &lt;strong&gt;HTTP methods&lt;/strong&gt;, meaningful &lt;strong&gt;status codes&lt;/strong&gt;, and structured &lt;strong&gt;JSON&lt;/strong&gt; responses.&lt;/p&gt;

&lt;p&gt;Unlike direct database access, clients never communicate with databases. Every interaction passes through a backend API where &lt;strong&gt;validation&lt;/strong&gt;, &lt;strong&gt;authentication&lt;/strong&gt;, &lt;strong&gt;authorization&lt;/strong&gt;, &lt;strong&gt;business logic&lt;/strong&gt;, and &lt;strong&gt;security&lt;/strong&gt; are enforced.&lt;/p&gt;

&lt;h1&gt;
  
  
  Client–Server Architecture
&lt;/h1&gt;

&lt;p&gt;Every HTTP request follows a predictable path.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-------------------+
| Client            |
| Browser / Mobile  |
+---------+---------+
          |
          | HTTP Request
          v
+---------+---------+
| Web Server        |
| Nginx / Apache    |
+---------+---------+
          |
          |
          v
+---------+---------+
| Backend API       |
| Express / Django  |
| Spring Boot       |
+---------+---------+
          |
          |
          v
+---------+---------+
| Business Logic    |
+---------+---------+
          |
          |
          v
+---------+---------+
| Database          |
| PostgreSQL/MySQL  |
+-------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;client&lt;/strong&gt; only knows how to call the &lt;strong&gt;API&lt;/strong&gt;. The backend decides &lt;strong&gt;how data is processed&lt;/strong&gt;, &lt;strong&gt;where it is stored&lt;/strong&gt;, and &lt;strong&gt;what response should be returned&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  HTTP Request Structure
&lt;/h1&gt;

&lt;p&gt;Every HTTP request contains several important parts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/users/15&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api.example.com&lt;/span&gt;
&lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer eyJhb...&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;
&lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Request Line&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTP Method&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Path&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP Version&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/users/15&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Headers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Headers provide additional information.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer TOKEN
Content-Type: application/json
Accept: application/json
User-Agent: Chrome
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authorization&lt;/strong&gt; → identifies the authenticated user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content-Type&lt;/strong&gt; → tells the server what format the body uses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accept&lt;/strong&gt; → tells the server which response formats are acceptable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Body&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Only requests like &lt;strong&gt;POST&lt;/strong&gt;, &lt;strong&gt;PUT&lt;/strong&gt;, and &lt;strong&gt;PATCH&lt;/strong&gt; usually include a body.&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alice@example.com"&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;p&gt;The backend parses this JSON before validating it.&lt;/p&gt;

&lt;h1&gt;
  
  
  HTTP Response Structure
&lt;/h1&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;

Content-Type: application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alice@example.com"&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;p&gt;A response contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Status Line&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  HTTP Methods
&lt;/h1&gt;

&lt;p&gt;REST maps different operations to different HTTP methods.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Method&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Retrieve data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Create a resource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PUT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Replace an entire resource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PATCH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Update specific fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DELETE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remove a resource&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Operations become&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET    /users
GET    /users/15

POST   /users

PUT    /users/15

PATCH  /users/15

DELETE /users/15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each endpoint performs exactly one responsibility.&lt;/p&gt;

&lt;h1&gt;
  
  
  REST Resource Design
&lt;/h1&gt;

&lt;p&gt;REST is &lt;strong&gt;resource-oriented&lt;/strong&gt;, not &lt;strong&gt;action-oriented&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Good&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/users
/products
/orders
/invoices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Poor&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/createUser
/getUsers/deleteUser
/updateUser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resources should be represented as &lt;strong&gt;nouns&lt;/strong&gt;, while the &lt;strong&gt;HTTP method&lt;/strong&gt; describes the action.&lt;/p&gt;

&lt;h1&gt;
  
  
  URL Hierarchy
&lt;/h1&gt;

&lt;p&gt;Well-designed URLs represent relationships.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/users

/users/15

/users/15/orders

/users/15/orders/8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The URL itself explains the resource hierarchy.&lt;/p&gt;

&lt;h1&gt;
  
  
  Building a REST API with Express
&lt;/h1&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="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="kd"&gt;let&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="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="mi"&gt;1&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="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;alice@example.com&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;The server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enables &lt;strong&gt;JSON parsing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;stores sample data&lt;/li&gt;
&lt;li&gt;exposes REST endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;GET&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="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;/users&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;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&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;Returns every user.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;GET by ID&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="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;/users/: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;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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nc"&gt;Number&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="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="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;404&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 not found&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The route parameter&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;captures the requested resource identifier.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;POST&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="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;/users&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;user&lt;/span&gt; &lt;span class="o"&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;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&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="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="nx"&gt;name&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;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="nx"&gt;email&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&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;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;201&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;receives JSON&lt;/li&gt;
&lt;li&gt;creates a new resource&lt;/li&gt;
&lt;li&gt;returns &lt;strong&gt;201 Created&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  HTTP Status Codes
&lt;/h1&gt;

&lt;p&gt;Every response should communicate what happened.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Meaning&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;200 OK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Request succeeded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;201 Created&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Resource created&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;204 No Content&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Success without response body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;400 Bad Request&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Invalid client input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;401 Unauthorized&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Authentication required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;403 Forbidden&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Permission denied&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;404 Not Found&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Resource does not exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;409 Conflict&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Duplicate or conflicting data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;422 Unprocessable Entity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Validation failed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;500 Internal Server Error&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unexpected server failure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Choosing the correct status code makes APIs easier to consume and debug.&lt;/p&gt;




&lt;h1&gt;
  
  
  JSON Response Standards
&lt;/h1&gt;

&lt;p&gt;Successful responses should remain consistent.&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;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&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;p&gt;Error responses should also follow a predictable structure.&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;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Email already exists"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"errors"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Duplicate email"&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;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;p&gt;Consistent response formats simplify frontend development and automated API integrations.&lt;/p&gt;

&lt;h1&gt;
  
  
  REST Design Principles
&lt;/h1&gt;

&lt;p&gt;A well-designed REST API follows several fundamental principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stateless Communication&lt;/strong&gt; — Every request contains all information required to process it. The server does not depend on previous requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource-Based URLs&lt;/strong&gt; — Endpoints represent resources instead of actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uniform Interface&lt;/strong&gt; — Similar resources follow the same naming and behavior patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standard HTTP Methods&lt;/strong&gt; — Use &lt;strong&gt;GET&lt;/strong&gt;, &lt;strong&gt;POST&lt;/strong&gt;, &lt;strong&gt;PUT&lt;/strong&gt;, &lt;strong&gt;PATCH&lt;/strong&gt;, and &lt;strong&gt;DELETE&lt;/strong&gt; according to their intended purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meaningful Status Codes&lt;/strong&gt; — Responses clearly indicate whether an operation succeeded or failed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON Payloads&lt;/strong&gt; — Structured, language-independent data format for requests and responses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idempotency&lt;/strong&gt; — Repeating &lt;strong&gt;GET&lt;/strong&gt;, &lt;strong&gt;PUT&lt;/strong&gt;, or &lt;strong&gt;DELETE&lt;/strong&gt; should produce the same result without unintended side effects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Backend Engineering eBook
&lt;/h2&gt;

&lt;p&gt;Master backend engineering from fundamentals to advanced concepts with practical projects and production-ready examples:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend Engineering eBook:&lt;/strong&gt; &lt;a href="https://codewithdhanian.gumroad.com/l/ungqng" rel="noopener noreferrer"&gt;https://codewithdhanian.gumroad.com/l/ungqng&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuim7qewy2bymwik1qn4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuim7qewy2bymwik1qn4c.png" alt="HTTP &amp;amp; RESTful API Design" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backenddevelopment</category>
    </item>
    <item>
      <title>How RAG actually works (clearly explained in under 2 mins):</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Fri, 07 Aug 2026 08:55:49 +0000</pubDate>
      <link>https://dev.to/code_2/how-rag-actually-worksclearly-explained-in-under-2-mins-f7n</link>
      <guid>https://dev.to/code_2/how-rag-actually-worksclearly-explained-in-under-2-mins-f7n</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhm77ze4ntystvm28tc6c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhm77ze4ntystvm28tc6c.png" alt="RAG" width="800" height="1200"&gt;&lt;/a&gt;RAG (Retrieval-Augmented Generation) is a system that retrieves relevant data and feeds it into an LLM before generating a response.&lt;/p&gt;

&lt;p&gt;It lets models answer questions using external knowledge, not just what they were trained on.&lt;/p&gt;

&lt;p&gt;If you’re building with these patterns, here's a great guide on scaling multi-agent RAG systems: &lt;a href="https://codewithdhanian.gumroad.com/l/miwqgy" rel="noopener noreferrer"&gt;https://codewithdhanian.gumroad.com/l/miwqgy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s a simple mental model to understand it:&lt;/p&gt;

&lt;p&gt;𝟭) 𝗗𝗮𝘁𝗮 𝗶𝘀 𝗶𝗻𝗴𝗲𝘀𝘁𝗲𝗱&lt;br&gt;
↳ Documents (PDFs, docs, APIs) are collected and split into chunks&lt;br&gt;
↳ Each chunk is cleaned and formatted ready for embedding&lt;/p&gt;

&lt;p&gt;𝟮) 𝗘𝗺𝗯𝗲𝗱𝗱𝗶𝗻𝗴𝘀 𝗮𝗿𝗲 𝗰𝗿𝗲𝗮𝘁𝗲𝗱&lt;br&gt;
↳ Each chunk is converted into a vector representation&lt;br&gt;
↳ Similar meaning → closer vectors&lt;/p&gt;

&lt;p&gt;𝟯) 𝗗𝗮𝘁𝗮 𝗶𝘀 𝘀𝘁𝗼𝗿𝗲𝗱&lt;br&gt;
↳ Vectors are stored in a vector database&lt;br&gt;
↳ Enables fast similarity search across large datasets&lt;/p&gt;

&lt;p&gt;𝟰) 𝗥𝗲𝗹𝗲𝘃𝗮𝗻𝘁 𝗰𝗼𝗻𝘁𝗲𝘅𝘁 𝗶𝘀 𝗿𝗲𝘁𝗿𝗶𝗲𝘃𝗲𝗱&lt;br&gt;
↳ The user's query is converted into an embedding (vector representation)&lt;br&gt;
↳ The system compares it against stored vectors and retrieves the most relevant chunks&lt;/p&gt;

&lt;p&gt;𝟱) 𝗧𝗵𝗲 𝗟𝗟𝗠 𝗴𝗲𝗻𝗲𝗿𝗮𝘁𝗲𝘀 𝘁𝗵𝗲 𝗮𝗻𝘀𝘄𝗲𝗿&lt;br&gt;
↳ The query + retrieved context are combined into a prompt&lt;br&gt;
↳ The model generates a grounded response&lt;/p&gt;

&lt;p&gt;That's the foundation of RAG. There are several types of RAG, each designed for different use cases and levels of complexity.&lt;/p&gt;

&lt;p&gt;If you’re curious what this actually looks like in practice (beyond diagrams), this repo is a great place to start: &lt;a href="https://codewithdhanian.gumroad.com/l/miwqgy" rel="noopener noreferrer"&gt;https://codewithdhanian.gumroad.com/l/miwqgy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It has:&lt;br&gt;
↳ E2E implementations of RAG, AI applications, agents, and systems&lt;br&gt;
↳ Resources covering AI agent architecture, reasoning strategies, and memory systems&lt;br&gt;
↳ Hands-on workshops and guided learning&lt;/p&gt;

&lt;p&gt;Star it to keep it bookmarked. This repo will keep growing, and you'll want it on hand as you build.&lt;/p&gt;

&lt;p&gt;What else would you add?&lt;/p&gt;

&lt;p&gt;——&lt;/p&gt;

&lt;p&gt;♻️ Repost to help others learn AI engineering.&lt;br&gt;
🙏 Remember to bookmark.&lt;br&gt;
➕ Follow me ( &lt;a class="mentioned-user" href="https://dev.to/e_opore"&gt;@e_opore&lt;/a&gt; ) to improve at AI engineering.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Day 5: Inserting Data – INSERT INTO, Multiple Rows, and RETURNING</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Sun, 24 May 2026 12:25:46 +0000</pubDate>
      <link>https://dev.to/code_2/day-5-inserting-data-insert-into-multiple-rows-and-returning-19bi</link>
      <guid>https://dev.to/code_2/day-5-inserting-data-insert-into-multiple-rows-and-returning-19bi</guid>
      <description>&lt;h3&gt;
  
  
  Introduction: Why Data Insertion Matters in Real-World Development
&lt;/h3&gt;

&lt;p&gt;In any production database system, inserting data is the primary way information enters your application. Whether you are building a user registration flow, logging e-commerce orders, importing CSV analytics data, or syncing IoT sensor readings, the &lt;code&gt;INSERT&lt;/code&gt; statement is the gateway between your application code and persistent storage.&lt;/p&gt;

&lt;p&gt;Mastering insertion is not just about syntax — it directly impacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application performance (single-row vs. bulk operations)&lt;/li&gt;
&lt;li&gt;Data integrity (handling defaults, constraints, and generated values)&lt;/li&gt;
&lt;li&gt;User experience (returning fresh IDs or computed fields instantly)&lt;/li&gt;
&lt;li&gt;Scalability (avoiding costly round-trips between app and database)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end of this tutorial you will confidently insert single records, bulk-load hundreds or thousands of rows efficiently, retrieve auto-generated values in one atomic operation using the &lt;code&gt;RETURNING&lt;/code&gt; clause (PostgreSQL), and apply production-grade best practices that senior engineers use daily.&lt;/p&gt;

&lt;p&gt;We will use &lt;strong&gt;PostgreSQL&lt;/strong&gt; for the main examples because the &lt;code&gt;RETURNING&lt;/code&gt; clause is native and extremely powerful here. MySQL equivalents and differences are clearly noted so you can apply the same concepts regardless of your stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The INSERT INTO Statement – Core Concepts
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;INSERT&lt;/code&gt; statement tells the database: “Here is new data — please store it according to the table’s structure.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basic Syntax&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...,&lt;/span&gt; &lt;span class="n"&gt;columnN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...,&lt;/span&gt; &lt;span class="n"&gt;valueN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;You explicitly list the columns you want to populate.&lt;/li&gt;
&lt;li&gt;The database fills any omitted columns with their &lt;code&gt;DEFAULT&lt;/code&gt; value or &lt;code&gt;NULL&lt;/code&gt; (if allowed).&lt;/li&gt;
&lt;li&gt;Order of values must match the order of columns in the parentheses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why list columns explicitly?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It makes your code resilient to future schema changes (new columns added later) and improves readability/maintainability.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Inserting a Single Row – Step-by-Step
&lt;/h3&gt;

&lt;p&gt;Assume we have this table (created in Day 4):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;product_id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;-- Auto-incrementing ID (PostgreSQL)&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="nb"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;stock&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&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;Single-row insertion example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Example 1: Full column list (most explicit and safest)&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Wireless Bluetooth Headphones'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;89&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Example 2: Omit columns that have defaults or are auto-generated&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'USB-C Cable'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens behind the scenes&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Database validates constraints (NOT NULL, data types, CHECK constraints).&lt;/li&gt;
&lt;li&gt;Generates default values where needed.&lt;/li&gt;
&lt;li&gt;Writes the row to disk (within a transaction).&lt;/li&gt;
&lt;li&gt;Returns success or raises an error.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;MySQL note&lt;/strong&gt;: Use the same syntax. The &lt;code&gt;SERIAL&lt;/code&gt; type becomes &lt;code&gt;AUTO_INCREMENT&lt;/code&gt; and the primary key.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Inserting Multiple Rows Efficiently
&lt;/h3&gt;

&lt;p&gt;Inserting rows one by one in a loop is a performance anti-pattern. Databases are optimized for set-based operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-row INSERT syntax&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Smart Watch'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;249&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Laptop Stand'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;34&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="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Wireless Mouse'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;120&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;Benefits&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One network round-trip instead of dozens.&lt;/li&gt;
&lt;li&gt;Single transaction → atomicity.&lt;/li&gt;
&lt;li&gt;Database can optimize batch writing and indexing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Production tip&lt;/strong&gt;: For thousands of rows, use PostgreSQL’s &lt;code&gt;COPY&lt;/code&gt; command or prepared statements with batching in your application language (e.g., &lt;code&gt;pg&lt;/code&gt; driver in Node.js with &lt;code&gt;multi-row&lt;/code&gt; mode).&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Handling NULL, DEFAULT, and Constraints
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Explicitly set NULL (only if column allows it)&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Test Product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Let DEFAULT kick in&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Free Sample Item'&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;Warning&lt;/strong&gt;: Never rely on implicit column order for critical applications. Always name columns.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The RETURNING Clause – The Magic of Getting Data Back Instantly (PostgreSQL)
&lt;/h3&gt;

&lt;p&gt;One of the most powerful features in PostgreSQL. After inserting, you can immediately retrieve any columns — especially auto-generated IDs, timestamps, or computed values — without a second &lt;code&gt;SELECT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'4K Webcam'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;129&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;RETURNING&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                    &lt;span class="c1"&gt;-- Return every column&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Practical examples&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Return only the new ID and creation timestamp&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Mechanical Keyboard'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;79&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;RETURNING&lt;/span&gt; &lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Return multiple rows when inserting many&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'HDMI Cable'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Monitor Arm'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;RETURNING&lt;/span&gt; &lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&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;Real-world use case&lt;/strong&gt;: In a REST API, when a user creates a new order, you can return the full order object (including the generated &lt;code&gt;order_id&lt;/code&gt;) in the same HTTP response. No extra query needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MySQL equivalent (versions 8.0.21+)&lt;/strong&gt;: MySQL now supports &lt;code&gt;RETURNING&lt;/code&gt; in INSERT, but older versions require &lt;code&gt;LAST_INSERT_ID()&lt;/code&gt; after the insert:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- MySQL alternative&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Example'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;LAST_INSERT_ID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Best Practices &amp;amp; Production Techniques
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always name columns&lt;/strong&gt; — never use &lt;code&gt;INSERT INTO table VALUES (...)&lt;/code&gt; in production code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use parameterized queries / prepared statements&lt;/strong&gt; to prevent SQL injection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch inserts&lt;/strong&gt; for bulk data (100–10,000 rows).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrap in transactions&lt;/strong&gt; when inserting related data across multiple tables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate data in the application layer&lt;/strong&gt; before hitting the database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor insert performance&lt;/strong&gt; with &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; on large operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider ON CONFLICT&lt;/strong&gt; (PostgreSQL) or &lt;code&gt;INSERT ... ON DUPLICATE KEY UPDATE&lt;/code&gt; (MySQL) for upsert patterns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example of safe, parameterized insert (conceptual — shown in SQL for clarity)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- In application code you would use placeholders&lt;/span&gt;
&lt;span class="k"&gt;PREPARE&lt;/span&gt; &lt;span class="n"&gt;insert_product&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;RETURNING&lt;/span&gt; &lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Common Pitfalls &amp;amp; Troubleshooting
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pitfall&lt;/th&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting column names&lt;/td&gt;
&lt;td&gt;Data goes into wrong columns&lt;/td&gt;
&lt;td&gt;Always list columns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Violating NOT NULL&lt;/td&gt;
&lt;td&gt;Error: null value in column&lt;/td&gt;
&lt;td&gt;Provide value or DEFAULT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type mismatch&lt;/td&gt;
&lt;td&gt;Error: invalid input syntax&lt;/td&gt;
&lt;td&gt;Cast or format correctly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting RETURNING&lt;/td&gt;
&lt;td&gt;Extra SELECT query needed&lt;/td&gt;
&lt;td&gt;Add RETURNING when possible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inserting in loop&lt;/td&gt;
&lt;td&gt;Slow performance, high latency&lt;/td&gt;
&lt;td&gt;Use multi-row or COPY&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  8. Real-World Project Example: E-Commerce Product Import
&lt;/h3&gt;

&lt;p&gt;Imagine you receive a CSV file from your supplier with 5,000 new products.&lt;br&gt;&lt;br&gt;
Instead of looping 5,000 times:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL efficient bulk import (Day 5 level)&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="s1"&gt;'/path/to/products.csv'&lt;/span&gt;
&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="s1"&gt;','&lt;/span&gt;
&lt;span class="n"&gt;CSV&lt;/span&gt; &lt;span class="n"&gt;HEADER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then query the newly imported rows using &lt;code&gt;RETURNING&lt;/code&gt; or a timestamp filter.&lt;/p&gt;

&lt;p&gt;This pattern is used by Shopify, Amazon, and every serious e-commerce platform.&lt;/p&gt;

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

&lt;p&gt;You now understand not just &lt;em&gt;how&lt;/em&gt; to insert data, but &lt;em&gt;why&lt;/em&gt; certain patterns matter in production systems. The combination of explicit column lists, multi-row inserts, and the &lt;code&gt;RETURNING&lt;/code&gt; clause gives you both safety and speed — the hallmarks of professional database engineering.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Always specify column names in &lt;code&gt;INSERT&lt;/code&gt; statements.&lt;/li&gt;
&lt;li&gt;Prefer multi-row &lt;code&gt;VALUES&lt;/code&gt; for performance.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;RETURNING&lt;/code&gt; (PostgreSQL) to eliminate extra queries.&lt;/li&gt;
&lt;li&gt;Validate early, insert atomically, and monitor with &lt;code&gt;EXPLAIN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Master these fundamentals before moving to advanced topics like triggers or stored procedures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You have completed Day 5. Your database now has data — the foundation for every query, join, and report you will build in the coming days.&lt;/p&gt;

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

</description>
      <category>sql</category>
    </item>
    <item>
      <title>Day 4: Creating Tables – Data Types, NULL, and DEFAULT Constraints</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Sun, 24 May 2026 02:46:06 +0000</pubDate>
      <link>https://dev.to/code_2/day-4-creating-tables-data-types-null-and-default-constraints-feb</link>
      <guid>https://dev.to/code_2/day-4-creating-tables-data-types-null-and-default-constraints-feb</guid>
      <description>&lt;h2&gt;
  
  
  The Foundation of Every Relational Database: Why Table Creation Matters
&lt;/h2&gt;

&lt;p&gt;When you build any production application—whether it is a customer management system, an inventory tracker, or a full-scale e-commerce platform—the &lt;strong&gt;table&lt;/strong&gt; becomes the core structural unit that holds your data. A &lt;strong&gt;table&lt;/strong&gt; in a &lt;strong&gt;relational database&lt;/strong&gt; is not just a spreadsheet; it is a precisely defined container that enforces rules about what data can live inside it, how that data is stored, and how the &lt;strong&gt;database engine&lt;/strong&gt; will interact with it for years to come.  &lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;CREATE TABLE&lt;/strong&gt; statement is the very first place where you, as a developer or architect, make decisions that affect performance, data integrity, storage costs, query speed, and even the long-term maintainability of your entire system. Today we will explore this statement in exhaustive detail: from the underlying theory of &lt;strong&gt;data types&lt;/strong&gt; to the subtle but critical behavior of &lt;strong&gt;NULL&lt;/strong&gt; values and the practical power of &lt;strong&gt;DEFAULT&lt;/strong&gt; constraints. We will examine real engineering trade-offs, internal database workflows, and the exact syntax you will use in both &lt;strong&gt;PostgreSQL&lt;/strong&gt; and &lt;strong&gt;MySQL&lt;/strong&gt;—the two databases you set up on Day 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CREATE TABLE Statement: Syntax, Structure, and Execution Flow
&lt;/h2&gt;

&lt;p&gt;At its core, the &lt;strong&gt;CREATE TABLE&lt;/strong&gt; command instructs the &lt;strong&gt;database management system&lt;/strong&gt; to allocate storage space, define column metadata, and register the table within the database’s system catalog. The engine parses your statement, validates data-type compatibility, applies any immediate constraints, and then creates the physical files (or pages) that will eventually hold rows.&lt;/p&gt;

&lt;p&gt;The basic structure looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;column_name1&lt;/span&gt; &lt;span class="n"&gt;data_type&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;constraints&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;column_name2&lt;/span&gt; &lt;span class="n"&gt;data_type&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;constraints&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;Every column definition consists of three mandatory parts and one optional but extremely important part:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;column name&lt;/strong&gt; (must be unique within the table)&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;data type&lt;/strong&gt; (determines storage format, range, and behavior)&lt;/li&gt;
&lt;li&gt;Optional &lt;strong&gt;constraints&lt;/strong&gt; such as &lt;strong&gt;NOT NULL&lt;/strong&gt; or &lt;strong&gt;DEFAULT&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the &lt;strong&gt;database engine&lt;/strong&gt; processes this statement, it performs several internal steps in sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Acquires a schema lock to prevent concurrent modifications.&lt;/li&gt;
&lt;li&gt;Validates that the chosen &lt;strong&gt;data types&lt;/strong&gt; exist and are compatible with the storage engine.&lt;/li&gt;
&lt;li&gt;Allocates space in the &lt;strong&gt;heap&lt;/strong&gt; (the main table storage area).&lt;/li&gt;
&lt;li&gt;Records the table definition in the system catalog tables (pg_class and pg_attribute in &lt;strong&gt;PostgreSQL&lt;/strong&gt;, or information_schema.columns in both engines).&lt;/li&gt;
&lt;li&gt;If the table is created successfully, it becomes immediately queryable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Choosing the wrong &lt;strong&gt;data type&lt;/strong&gt; or forgetting a &lt;strong&gt;constraint&lt;/strong&gt; at this stage can force you to run expensive &lt;strong&gt;ALTER TABLE&lt;/strong&gt; operations later—which lock the table and can cause downtime in high-traffic systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Types: The Language Your Database Speaks
&lt;/h2&gt;

&lt;p&gt;Every value you store must be declared with an explicit &lt;strong&gt;data type&lt;/strong&gt;. The &lt;strong&gt;database engine&lt;/strong&gt; uses this declaration to decide how much disk space to reserve, how to encode the value in memory, how to compare values during queries, and how to index the column efficiently. Selecting the correct &lt;strong&gt;data type&lt;/strong&gt; is both an art and a science; it directly impacts storage costs, query performance, and application correctness.&lt;/p&gt;

&lt;h3&gt;
  
  
  Numeric Data Types
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Integer&lt;/strong&gt; types are the workhorses of most applications. In &lt;strong&gt;PostgreSQL&lt;/strong&gt; you have &lt;strong&gt;SMALLINT&lt;/strong&gt; (2 bytes, ±32,767), &lt;strong&gt;INTEGER&lt;/strong&gt; (4 bytes, ±2.1 billion), and &lt;strong&gt;BIGINT&lt;/strong&gt; (8 bytes, ±9 quintillion). &lt;strong&gt;MySQL&lt;/strong&gt; offers the nearly identical &lt;strong&gt;TINYINT&lt;/strong&gt;, &lt;strong&gt;SMALLINT&lt;/strong&gt;, &lt;strong&gt;MEDIUMINT&lt;/strong&gt;, &lt;strong&gt;INT&lt;/strong&gt;, and &lt;strong&gt;BIGINT&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;For fractional numbers, use &lt;strong&gt;NUMERIC(precision, scale)&lt;/strong&gt; (also called &lt;strong&gt;DECIMAL&lt;/strong&gt; in &lt;strong&gt;MySQL&lt;/strong&gt;). This type stores exact decimal values—critical for financial data—unlike &lt;strong&gt;REAL&lt;/strong&gt; or &lt;strong&gt;DOUBLE PRECISION&lt;/strong&gt;, which use floating-point approximation and can introduce rounding errors that accumulate over millions of transactions.&lt;/p&gt;

&lt;p&gt;Real-world example: an order total column should never use &lt;strong&gt;DOUBLE PRECISION&lt;/strong&gt;; always use &lt;strong&gt;NUMERIC(12,2)&lt;/strong&gt; to guarantee penny-level accuracy across years of compounding calculations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Character Data Types
&lt;/h3&gt;

&lt;p&gt;Text storage comes in two families. &lt;strong&gt;VARCHAR(n)&lt;/strong&gt; stores variable-length strings up to n characters and is the default choice in modern applications. &lt;strong&gt;TEXT&lt;/strong&gt; (or &lt;strong&gt;LONGTEXT&lt;/strong&gt; in &lt;strong&gt;MySQL&lt;/strong&gt;) removes the length limit entirely and is ideal for product descriptions or user comments.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CHAR(n)&lt;/strong&gt; is fixed-length and right-pads with spaces; it can be slightly faster for very short, consistently sized fields (e.g., country codes), but it wastes space otherwise. In high-scale systems, the performance difference between &lt;strong&gt;VARCHAR&lt;/strong&gt; and &lt;strong&gt;TEXT&lt;/strong&gt; is negligible because both are stored out-of-line when they grow large, but the choice still matters for index size and memory usage during sorting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Date and Time Data Types
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DATE&lt;/strong&gt;, &lt;strong&gt;TIME&lt;/strong&gt;, &lt;strong&gt;TIMESTAMP&lt;/strong&gt;, and &lt;strong&gt;TIMESTAMPTZ&lt;/strong&gt; (timestamp with time zone in &lt;strong&gt;PostgreSQL&lt;/strong&gt;) are essential. &lt;strong&gt;PostgreSQL&lt;/strong&gt;’s &lt;strong&gt;TIMESTAMPTZ&lt;/strong&gt; automatically normalizes everything to UTC internally while preserving the original time zone for display—an architectural decision that prevents daylight-saving bugs that plague many legacy &lt;strong&gt;MySQL&lt;/strong&gt; applications using plain &lt;strong&gt;DATETIME&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Always store timestamps with time zone awareness unless your entire system operates in a single fixed timezone. The internal workflow is simple: the engine converts the input to UTC on write and converts back on read based on the client’s session timezone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Boolean and Specialized Types
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;BOOLEAN&lt;/strong&gt; type (or &lt;strong&gt;BOOL&lt;/strong&gt;) stores true, false, or &lt;strong&gt;NULL&lt;/strong&gt;. It occupies only one byte yet saves you from the classic “0/1 magic number” anti-pattern that leads to bugs when someone later interprets 2 as “maybe.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt; also offers &lt;strong&gt;JSONB&lt;/strong&gt; for semi-structured data and &lt;strong&gt;UUID&lt;/strong&gt; for globally unique identifiers—both of which we will use in production examples later in the series.&lt;/p&gt;

&lt;h2&gt;
  
  
  NULL: The Concept of “Value Unknown”
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NULL&lt;/strong&gt; is not a value; it is the explicit absence of a value. The &lt;strong&gt;SQL standard&lt;/strong&gt; treats &lt;strong&gt;NULL&lt;/strong&gt; through &lt;strong&gt;three-valued logic&lt;/strong&gt; (true, false, unknown). This means that any comparison involving &lt;strong&gt;NULL&lt;/strong&gt;—even &lt;code&gt;NULL = NULL&lt;/code&gt;—evaluates to unknown, not true.  &lt;/p&gt;

&lt;p&gt;From an architectural standpoint, the &lt;strong&gt;database engine&lt;/strong&gt; stores a special null bitmap for each row. When a column is &lt;strong&gt;NULL&lt;/strong&gt;, the engine skips storing any data for that column, saving space. However, this bitmap adds a tiny overhead to every row, which becomes measurable only at billions of rows.&lt;/p&gt;

&lt;p&gt;In real systems, &lt;strong&gt;NULL&lt;/strong&gt; represents legitimate business states: “user has not yet set a middle name,” “order has not yet shipped,” or “product has no discount expiration date.” Misusing &lt;strong&gt;NULL&lt;/strong&gt; for “zero” or “empty string” is one of the most common sources of incorrect analytics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enforcing Presence with NOT NULL Constraints
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;NOT NULL&lt;/strong&gt; constraint tells the &lt;strong&gt;database engine&lt;/strong&gt; to reject any &lt;strong&gt;INSERT&lt;/strong&gt; or &lt;strong&gt;UPDATE&lt;/strong&gt; that would leave the column without a value. This is enforced at write time, before the row reaches disk.  &lt;/p&gt;

&lt;p&gt;Placing &lt;strong&gt;NOT NULL&lt;/strong&gt; on columns that your application logic depends on (email, created_at, status) prevents entire classes of runtime errors. It also allows the query planner to generate more efficient execution plans because the engine knows the column will never be unknown.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supplying Sensible Defaults with the DEFAULT Constraint
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;DEFAULT&lt;/strong&gt; constraint provides an automatic value when none is supplied during an &lt;strong&gt;INSERT&lt;/strong&gt;. The engine evaluates the default expression at write time and substitutes it seamlessly.  &lt;/p&gt;

&lt;p&gt;Common realistic defaults include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CURRENT_TIMESTAMP&lt;/code&gt; or &lt;code&gt;NOW()&lt;/code&gt; for audit columns&lt;/li&gt;
&lt;li&gt;A literal string such as &lt;code&gt;'active'&lt;/code&gt; for status columns&lt;/li&gt;
&lt;li&gt;A numeric literal such as &lt;code&gt;0.00&lt;/code&gt; for price fields&lt;/li&gt;
&lt;li&gt;A complex expression such as &lt;code&gt;gen_random_uuid()&lt;/code&gt; in &lt;strong&gt;PostgreSQL&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt; and &lt;strong&gt;PostgreSQL&lt;/strong&gt; both support &lt;strong&gt;DEFAULT&lt;/strong&gt; on almost every data type, but &lt;strong&gt;PostgreSQL&lt;/strong&gt; allows far richer expressions (including subqueries and functions) because its parser is more expressive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Production-Grade Table: A Complete Realistic Example
&lt;/h2&gt;

&lt;p&gt;Let us create a &lt;strong&gt;users&lt;/strong&gt; table that reflects real engineering decisions made every day in SaaS companies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL version&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;              &lt;span class="nb"&gt;BIGINT&lt;/span&gt; &lt;span class="k"&gt;GENERATED&lt;/span&gt; &lt;span class="n"&gt;ALWAYS&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;           &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;full_name&lt;/span&gt;       &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt;        &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt;          &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt;      &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt;  &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;last_login_at&lt;/span&gt;   &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;preferences&lt;/span&gt;     &lt;span class="n"&gt;JSONB&lt;/span&gt;        &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'{}'&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;JSONB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;is_verified&lt;/span&gt;     &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt;      &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Equivalent MySQL version (note AUTO_INCREMENT and slight syntax differences)&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;              &lt;span class="nb"&gt;BIGINT&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;           &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;full_name&lt;/span&gt;       &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt;        &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt;          &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt;      &lt;span class="nb"&gt;DATETIME&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="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&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="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;last_login_at&lt;/span&gt;   &lt;span class="nb"&gt;DATETIME&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="n"&gt;preferences&lt;/span&gt;     &lt;span class="n"&gt;JSON&lt;/span&gt;         &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JSON_OBJECT&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;is_verified&lt;/span&gt;     &lt;span class="nb"&gt;TINYINT&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;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;InnoDB&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;CHARSET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;utf8mb4&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;utf8mb4_unicode_ci&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Walk through the logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;id&lt;/strong&gt; uses an auto-incrementing or identity column so the engine guarantees uniqueness without application-level coordination.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;email&lt;/strong&gt; is &lt;strong&gt;NOT NULL&lt;/strong&gt; because every user must have one; the &lt;strong&gt;database engine&lt;/strong&gt; will reject any attempt to create a row without it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;status&lt;/strong&gt; has a &lt;strong&gt;DEFAULT&lt;/strong&gt; so new users start in a safe pending state even if the application forgets to specify it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;created_at&lt;/strong&gt; defaults to the exact moment of insertion, providing a reliable audit trail without requiring application code to remember to set it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;preferences&lt;/strong&gt; as &lt;strong&gt;JSONB&lt;/strong&gt; (PostgreSQL) or &lt;strong&gt;JSON&lt;/strong&gt; (MySQL) allows flexible storage of user settings without schema changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you execute this statement, the &lt;strong&gt;database engine&lt;/strong&gt; creates the table, builds the internal row header with the null bitmap, reserves space for the default values, and registers the column metadata so future queries can leverage type information for optimization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engineering Trade-offs, Performance Implications, and Best Practices
&lt;/h2&gt;

&lt;p&gt;Choosing &lt;strong&gt;data types&lt;/strong&gt; and constraints is never free.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wider numeric types (&lt;strong&gt;BIGINT&lt;/strong&gt; vs &lt;strong&gt;INTEGER&lt;/strong&gt;) double storage and index size but prevent overflow bugs that crash production systems.
&lt;/li&gt;
&lt;li&gt;Variable-length types (&lt;strong&gt;VARCHAR&lt;/strong&gt;, &lt;strong&gt;TEXT&lt;/strong&gt;) are more space-efficient but require an extra length prefix and can fragment pages over time.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NOT NULL&lt;/strong&gt; columns allow the query planner to skip null-check branches, improving index usage and reducing CPU cycles.
&lt;/li&gt;
&lt;li&gt;Over-use of &lt;strong&gt;DEFAULT&lt;/strong&gt; expressions that call functions (e.g., &lt;code&gt;NOW()&lt;/code&gt;) adds microseconds per row; in a table receiving 10,000 inserts per second, this becomes measurable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Best practice: declare the narrowest, most restrictive &lt;strong&gt;data type&lt;/strong&gt; and the strictest &lt;strong&gt;constraints&lt;/strong&gt; that still match real business rules. Run &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; on representative queries after creation to validate that the engine is using the types and constraints you intended. In high-scale environments, these early decisions determine whether your database stays on a single node or needs sharding later.&lt;/p&gt;

&lt;p&gt;For teams working in both &lt;strong&gt;PostgreSQL&lt;/strong&gt; and &lt;strong&gt;MySQL&lt;/strong&gt;, maintain separate migration scripts or use an abstraction layer that understands the subtle syntax differences—especially around default timestamps and identity columns.&lt;/p&gt;

&lt;p&gt;If you want to take these concepts from theory to production-grade mastery with dozens of additional exercises, real schema evolution patterns, and battle-tested migration strategies, grab the comprehensive &lt;strong&gt;SQL Playbook&lt;/strong&gt; at &lt;a href="https://codewithdhanian.gumroad.com/l/hjmix" rel="noopener noreferrer"&gt;https://codewithdhanian.gumroad.com/l/hjmix&lt;/a&gt; —it was built exactly for engineers who want to move beyond tutorials and ship reliable systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F852lmmfrwuxf6hla2dj1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F852lmmfrwuxf6hla2dj1.png" alt="Creating SQL tables: data types and constraints" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
    </item>
    <item>
      <title>Day 3: Creating and Dropping Databases – CREATE DATABASE, DROP DATABASE</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Sat, 23 May 2026 12:38:47 +0000</pubDate>
      <link>https://dev.to/code_2/day-3-creating-and-dropping-databases-create-database-drop-database-3kdk</link>
      <guid>https://dev.to/code_2/day-3-creating-and-dropping-databases-create-database-drop-database-3kdk</guid>
      <description>&lt;p&gt;Creating a &lt;strong&gt;database&lt;/strong&gt; is one of the most fundamental operations you will perform as a SQL developer or database engineer. It marks the moment you move from simply connecting to a &lt;strong&gt;database management system&lt;/strong&gt; to actually owning and organizing your own structured data environment. In this tutorial, we will explore exactly how &lt;strong&gt;databases&lt;/strong&gt; are created and removed, why these operations behave the way they do under the hood, and how to handle them responsibly in both development and production environments.&lt;/p&gt;

&lt;p&gt;We will work with the two most popular open-source &lt;strong&gt;relational database management systems&lt;/strong&gt; introduced earlier: &lt;strong&gt;PostgreSQL&lt;/strong&gt; and &lt;strong&gt;MySQL&lt;/strong&gt;. Although both support the core SQL commands &lt;strong&gt;CREATE DATABASE&lt;/strong&gt; and &lt;strong&gt;DROP DATABASE&lt;/strong&gt;, their implementations differ in important architectural ways that affect performance, security, and scalability.&lt;/p&gt;

&lt;h3&gt;
  
  
  What a Database Actually Represents
&lt;/h3&gt;

&lt;p&gt;Before writing any code, it is essential to understand what a &lt;strong&gt;database&lt;/strong&gt; truly is from an architectural perspective. In a &lt;strong&gt;relational database management system&lt;/strong&gt;, a &lt;strong&gt;database&lt;/strong&gt; is a named container that holds multiple &lt;strong&gt;schemas&lt;/strong&gt;, &lt;strong&gt;tables&lt;/strong&gt;, &lt;strong&gt;indexes&lt;/strong&gt;, &lt;strong&gt;views&lt;/strong&gt;, &lt;strong&gt;functions&lt;/strong&gt;, and other database objects. It acts as a logical boundary for data isolation, access control, and resource allocation.&lt;/p&gt;

&lt;p&gt;Physically, a &lt;strong&gt;database&lt;/strong&gt; is more than just a name. In &lt;strong&gt;PostgreSQL&lt;/strong&gt;, each &lt;strong&gt;database&lt;/strong&gt; corresponds to a separate set of files on disk, managed by the &lt;strong&gt;postmaster&lt;/strong&gt; process. These files store the actual data pages, transaction logs (&lt;strong&gt;WAL&lt;/strong&gt;), and catalog metadata. In &lt;strong&gt;MySQL&lt;/strong&gt; (using the default &lt;strong&gt;InnoDB&lt;/strong&gt; storage engine), each &lt;strong&gt;database&lt;/strong&gt; typically maps to a subdirectory under the MySQL data directory, with table definitions and data stored in &lt;code&gt;.frm&lt;/code&gt;, &lt;code&gt;.ibd&lt;/code&gt;, or similar files depending on the engine.&lt;/p&gt;

&lt;p&gt;This separation is deliberate. It allows a single &lt;strong&gt;database server&lt;/strong&gt; instance to host dozens or even hundreds of independent &lt;strong&gt;databases&lt;/strong&gt;, each with its own security context and performance characteristics. This architecture is what enables multi-tenant applications, separate development/staging/production environments, and efficient resource isolation.&lt;/p&gt;

&lt;h3&gt;
  
  
  The CREATE DATABASE Statement
&lt;/h3&gt;

&lt;p&gt;The primary command to create a new &lt;strong&gt;database&lt;/strong&gt; is &lt;strong&gt;CREATE DATABASE&lt;/strong&gt;. The basic syntax is intentionally simple, yet the optional clauses reveal deep control over how the &lt;strong&gt;database&lt;/strong&gt; will behave.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL version&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;my_app_production&lt;/span&gt;
    &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;OWNER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;postgres&lt;/span&gt;
         &lt;span class="k"&gt;ENCODING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'UTF8'&lt;/span&gt;
         &lt;span class="n"&gt;LC_COLLATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'en_US.UTF-8'&lt;/span&gt;
         &lt;span class="n"&gt;LC_CTYPE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'en_US.UTF-8'&lt;/span&gt;
         &lt;span class="k"&gt;TEMPLATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;template0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- MySQL version&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;my_app_production&lt;/span&gt;
    &lt;span class="nb"&gt;CHARACTER&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;utf8mb4&lt;/span&gt;
    &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="n"&gt;utf8mb4_unicode_ci&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let us break down every important part of these statements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WITH&lt;/strong&gt; (PostgreSQL only): Introduces a list of optional parameters that configure the new &lt;strong&gt;database&lt;/strong&gt; at creation time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OWNER&lt;/strong&gt;: Specifies which &lt;strong&gt;role&lt;/strong&gt; (user) will own the &lt;strong&gt;database&lt;/strong&gt;. The owner has full rights to create objects, grant privileges, and drop the &lt;strong&gt;database&lt;/strong&gt; later. In production systems, it is a best practice to create a dedicated application &lt;strong&gt;role&lt;/strong&gt; with the least privileges necessary rather than using the default superuser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ENCODING&lt;/strong&gt; / &lt;strong&gt;CHARACTER SET&lt;/strong&gt;: Defines how text data will be stored. &lt;strong&gt;UTF8&lt;/strong&gt; (PostgreSQL) or &lt;strong&gt;utf8mb4&lt;/strong&gt; (MySQL) is almost always the correct choice today because it properly supports international characters, emojis, and modern languages without data corruption.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LC_COLLATE&lt;/strong&gt; and &lt;strong&gt;LC_CTYPE&lt;/strong&gt;: Control how string sorting and character classification work. These settings affect query performance on text columns and the results of &lt;strong&gt;ORDER BY&lt;/strong&gt; operations. Choosing the wrong collation can lead to unexpected sorting behavior or degraded index performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TEMPLATE&lt;/strong&gt; (PostgreSQL): Every new &lt;strong&gt;database&lt;/strong&gt; is cloned from a template. The default &lt;strong&gt;template1&lt;/strong&gt; includes standard objects and extensions. Using &lt;strong&gt;template0&lt;/strong&gt; gives you a completely clean slate, which is preferable when you want strict control over what exists in the new &lt;strong&gt;database&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In &lt;strong&gt;MySQL&lt;/strong&gt;, the equivalent parameters are simpler because &lt;strong&gt;MySQL&lt;/strong&gt; handles character sets at both the server and &lt;strong&gt;database&lt;/strong&gt; level. The &lt;strong&gt;COLLATE&lt;/strong&gt; clause determines the default sorting and comparison rules for all tables created inside that &lt;strong&gt;database&lt;/strong&gt; unless overridden at the table or column level.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why These Options Matter in Real Engineering
&lt;/h3&gt;

&lt;p&gt;Choosing the right &lt;strong&gt;encoding&lt;/strong&gt; and &lt;strong&gt;collation&lt;/strong&gt; at creation time is not a cosmetic decision. Once a &lt;strong&gt;database&lt;/strong&gt; is created, changing these properties is extremely difficult and often requires a full data export/import cycle. In large-scale systems, incorrect collation choices have caused production incidents where searches and sorts returned inconsistent results across environments.&lt;/p&gt;

&lt;p&gt;Performance implications are also significant. A &lt;strong&gt;database&lt;/strong&gt; with the wrong &lt;strong&gt;collation&lt;/strong&gt; can prevent the query planner from using indexes efficiently during text comparisons, leading to full table scans even when indexes exist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating Databases in Practice: Development Workflows
&lt;/h3&gt;

&lt;p&gt;Professional developers rarely create &lt;strong&gt;databases&lt;/strong&gt; manually in production. Instead, they follow repeatable workflows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use infrastructure-as-code tools or migration scripts.&lt;/li&gt;
&lt;li&gt;Create separate &lt;strong&gt;databases&lt;/strong&gt; for development, testing, and production.&lt;/li&gt;
&lt;li&gt;Automate creation as part of CI/CD pipelines so every developer works with identical starting conditions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is a realistic example of a script you might keep in your project repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- create_dev_db.sql&lt;/span&gt;
&lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_database&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;datname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'my_app_dev'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
        &lt;span class="n"&gt;PERFORM&lt;/span&gt; &lt;span class="n"&gt;dblink_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'host=localhost user=postgres'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'CREATE DATABASE my_app_dev WITH OWNER = app_user ENCODING = &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;UTF8&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern uses a conditional check to make the script idempotent, meaning it can be run multiple times without error.&lt;/p&gt;

&lt;h3&gt;
  
  
  The DROP DATABASE Statement
&lt;/h3&gt;

&lt;p&gt;Removing a &lt;strong&gt;database&lt;/strong&gt; is the counterpart to creation and must be treated with respect. The syntax is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL&lt;/span&gt;
&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;my_app_production&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Safer version&lt;/span&gt;
&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;my_app_production&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- MySQL&lt;/span&gt;
&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;my_app_production&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;my_app_production&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;IF EXISTS&lt;/strong&gt; clause prevents an error if the &lt;strong&gt;database&lt;/strong&gt; does not exist. This is especially valuable in automated scripts.&lt;/p&gt;

&lt;p&gt;Important behavior differences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;PostgreSQL&lt;/strong&gt;, you cannot drop a &lt;strong&gt;database&lt;/strong&gt; while active connections exist. The server will reject the command unless you use the &lt;strong&gt;WITH FORCE&lt;/strong&gt; option (available in newer versions) or first terminate connections manually.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;MySQL&lt;/strong&gt;, dropping a &lt;strong&gt;database&lt;/strong&gt; is more permissive but still requires appropriate privileges.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DROP DATABASE&lt;/strong&gt; is a permanent, non-recoverable operation in most cases. The files on disk are removed, and all data disappears. This is why production systems almost never allow direct &lt;strong&gt;DROP DATABASE&lt;/strong&gt; commands except during controlled maintenance windows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Internal Workflows and System Behavior
&lt;/h3&gt;

&lt;p&gt;When you execute &lt;strong&gt;CREATE DATABASE&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;database server&lt;/strong&gt; validates your permissions.&lt;/li&gt;
&lt;li&gt;It allocates a new &lt;strong&gt;database OID&lt;/strong&gt; (object identifier).&lt;/li&gt;
&lt;li&gt;It copies the template files (PostgreSQL) or creates a new subdirectory (MySQL).&lt;/li&gt;
&lt;li&gt;It updates the system catalogs (&lt;strong&gt;pg_database&lt;/strong&gt; in PostgreSQL, &lt;strong&gt;mysql&lt;/strong&gt; system database in MySQL).&lt;/li&gt;
&lt;li&gt;It initializes the default &lt;strong&gt;schema&lt;/strong&gt; (public in PostgreSQL, the database itself in MySQL).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you execute &lt;strong&gt;DROP DATABASE&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The server checks for active connections and may block or terminate them.&lt;/li&gt;
&lt;li&gt;It removes all associated files from the filesystem.&lt;/li&gt;
&lt;li&gt;It cleans up metadata entries across system catalogs.&lt;/li&gt;
&lt;li&gt;Any open transactions involving that &lt;strong&gt;database&lt;/strong&gt; are rolled back or invalidated.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These operations affect the entire server instance. On very large systems, creating or dropping &lt;strong&gt;databases&lt;/strong&gt; can momentarily increase I/O load because of file system operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices and Scalability Considerations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Never create &lt;strong&gt;databases&lt;/strong&gt; with generic names like "test" or "db1" in production. Use descriptive, versioned names that reflect purpose and environment.&lt;/li&gt;
&lt;li&gt;Prefer &lt;strong&gt;schemas&lt;/strong&gt; over multiple &lt;strong&gt;databases&lt;/strong&gt; when you need logical separation within the same data set. This is more efficient because it avoids the overhead of managing separate file sets.&lt;/li&gt;
&lt;li&gt;In multi-tenant SaaS applications, some teams create one &lt;strong&gt;database&lt;/strong&gt; per customer for strong isolation, while others use a single &lt;strong&gt;database&lt;/strong&gt; with tenant_id columns. Each approach has different scalability and backup implications.&lt;/li&gt;
&lt;li&gt;Always back up critical &lt;strong&gt;databases&lt;/strong&gt; before any &lt;strong&gt;DROP&lt;/strong&gt; operation.&lt;/li&gt;
&lt;li&gt;Grant the minimal privileges necessary. Application users should rarely have &lt;strong&gt;CREATE DATABASE&lt;/strong&gt; or &lt;strong&gt;DROP DATABASE&lt;/strong&gt; rights.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Real-World Engineering Example
&lt;/h3&gt;

&lt;p&gt;Imagine you are building an e-commerce platform. You might maintain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ecommerce_production&lt;/code&gt; – live customer data&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ecommerce_staging&lt;/code&gt; – pre-production testing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ecommerce_dev&lt;/code&gt; – local development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You would create these using scripts that also initialize required extensions, default roles, and security policies. When a new feature requires schema changes that cannot be rolled back easily, you create a fresh &lt;strong&gt;database&lt;/strong&gt; from a recent backup of production, test the migration thoroughly, then promote the change.&lt;/p&gt;

&lt;p&gt;These patterns ensure consistency, reduce human error, and make your infrastructure reproducible.&lt;/p&gt;

&lt;p&gt;For even more in-depth examples and exercises, consider purchasing this SQL Playbook: &lt;a href="https://codewithdhanian.gumroad.com/l/hjmix" rel="noopener noreferrer"&gt;https://codewithdhanian.gumroad.com/l/hjmix&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>sql</category>
    </item>
    <item>
      <title>Day 2: Installing PostgreSQL/MySQL and Setting Up Your First Database</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Sat, 23 May 2026 12:16:57 +0000</pubDate>
      <link>https://dev.to/code_2/day-2-installing-postgresqlmysql-and-setting-up-your-first-database-1mm8</link>
      <guid>https://dev.to/code_2/day-2-installing-postgresqlmysql-and-setting-up-your-first-database-1mm8</guid>
      <description>&lt;p&gt;In database development, the quality of your local environment directly determines how effectively you will learn and how reliably you will build production systems later. Today we focus entirely on installing &lt;strong&gt;PostgreSQL&lt;/strong&gt; and &lt;strong&gt;MySQL&lt;/strong&gt;, understanding the &lt;strong&gt;client-server architecture&lt;/strong&gt; that powers them, and creating your first functional &lt;strong&gt;database&lt;/strong&gt;. We will examine every step from a professional engineering perspective so you can make informed decisions whether you are a complete beginner or an experienced developer setting up a new machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Client-Server Architecture Behind Every Relational Database
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;relational database management system&lt;/strong&gt; (&lt;strong&gt;RDBMS&lt;/strong&gt;) is never just a file on your computer. It follows a strict &lt;strong&gt;client-server model&lt;/strong&gt;. The &lt;strong&gt;database server&lt;/strong&gt; is a background process (daemon) that runs continuously, manages data files on disk, enforces &lt;strong&gt;referential integrity&lt;/strong&gt;, handles concurrent connections, and executes &lt;strong&gt;SQL&lt;/strong&gt; statements. The &lt;strong&gt;client&lt;/strong&gt; is any tool or application that connects to this server over the network or locally via a socket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt; and &lt;strong&gt;MySQL&lt;/strong&gt; both implement this architecture, but they differ in design philosophy. &lt;strong&gt;PostgreSQL&lt;/strong&gt; is a fully &lt;strong&gt;object-relational&lt;/strong&gt; system with strong emphasis on standards compliance, extensibility, and advanced features such as &lt;strong&gt;JSONB&lt;/strong&gt; support and custom data types. &lt;strong&gt;MySQL&lt;/strong&gt; is optimized for read-heavy web workloads and remains the default choice for many content-driven applications due to its speed and widespread ecosystem support.&lt;/p&gt;

&lt;p&gt;When the server starts, it listens on a specific &lt;strong&gt;TCP port&lt;/strong&gt;: &lt;strong&gt;5432&lt;/strong&gt; for &lt;strong&gt;PostgreSQL&lt;/strong&gt; and &lt;strong&gt;3306&lt;/strong&gt; for &lt;strong&gt;MySQL&lt;/strong&gt;. Clients connect using these ports, authenticate with a username and password, and then send &lt;strong&gt;SQL&lt;/strong&gt; commands. The server parses the query, checks permissions, optimizes the execution plan using its internal &lt;strong&gt;query planner&lt;/strong&gt;, and returns results. Understanding this flow helps you debug connection issues later and appreciate why proper installation and configuration matter for both development speed and long-term scalability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing Between PostgreSQL and MySQL
&lt;/h2&gt;

&lt;p&gt;Both systems are excellent open-source &lt;strong&gt;RDBMS&lt;/strong&gt; options, but they serve slightly different needs. &lt;strong&gt;PostgreSQL&lt;/strong&gt; excels in complex queries, &lt;strong&gt;window functions&lt;/strong&gt;, full &lt;strong&gt;ACID&lt;/strong&gt; compliance out of the box, and handling large analytical workloads. &lt;strong&gt;MySQL&lt;/strong&gt; is often lighter on resources and has tighter integration with popular web stacks such as PHP and certain cloud platforms. Many professional developers install both so they can work on different projects without friction. We will cover the complete installation process for each.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing PostgreSQL
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation on Major Operating Systems
&lt;/h3&gt;

&lt;p&gt;The installation process places the &lt;strong&gt;PostgreSQL&lt;/strong&gt; server binaries, client tools, and default data directory on your system.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;macOS&lt;/strong&gt;, the recommended developer approach uses &lt;strong&gt;Homebrew&lt;/strong&gt;. Open your terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;postgresql
brew services start postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command installs the latest stable version, creates the necessary directories, and registers &lt;strong&gt;PostgreSQL&lt;/strong&gt; as a background service that starts automatically.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;Ubuntu/Debian Linux&lt;/strong&gt;, use the package manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;postgresql postgresql-contrib
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On &lt;strong&gt;Windows&lt;/strong&gt;, download the official EnterpriseDB installer from the &lt;strong&gt;PostgreSQL&lt;/strong&gt; website and follow the wizard. Choose the default port &lt;strong&gt;5432&lt;/strong&gt; and remember the password you set for the &lt;strong&gt;postgres&lt;/strong&gt; superuser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Post-Installation Verification and Initialization
&lt;/h3&gt;

&lt;p&gt;After installation, &lt;strong&gt;PostgreSQL&lt;/strong&gt; runs an initialization process called &lt;strong&gt;initdb&lt;/strong&gt; (automatically handled by the installer or package manager). This creates the &lt;strong&gt;data directory&lt;/strong&gt; (often &lt;code&gt;/var/lib/postgresql/data&lt;/code&gt; on Linux or &lt;code&gt;~/Library/Application Support/Postgres&lt;/code&gt; on macOS) containing the system catalogs, template databases, and configuration files.&lt;/p&gt;

&lt;p&gt;Verify everything is running by checking the service status or using the client tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;psql &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This confirms the &lt;strong&gt;psql&lt;/strong&gt; command-line client is available and in your &lt;strong&gt;PATH&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Switch to the default &lt;strong&gt;postgres&lt;/strong&gt; user (on Linux/macOS) or open &lt;strong&gt;pgAdmin&lt;/strong&gt; on Windows to continue setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Your First PostgreSQL Database
&lt;/h2&gt;

&lt;p&gt;Create a dedicated database and user instead of using the default &lt;strong&gt;postgres&lt;/strong&gt; superuser for daily work. This follows security best practices and prevents accidental destructive commands.&lt;/p&gt;

&lt;p&gt;First, create a new user account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="n"&gt;myappuser&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;PASSWORD&lt;/span&gt; &lt;span class="s1"&gt;'strong_password_here'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create the actual database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;myfirstdb&lt;/span&gt; &lt;span class="k"&gt;OWNER&lt;/span&gt; &lt;span class="n"&gt;myappuser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grant necessary privileges:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;myfirstdb&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;myappuser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connect to your new database using the &lt;strong&gt;psql&lt;/strong&gt; client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;psql &lt;span class="nt"&gt;-U&lt;/span&gt; myappuser &lt;span class="nt"&gt;-d&lt;/span&gt; myfirstdb &lt;span class="nt"&gt;-h&lt;/span&gt; localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-U&lt;/code&gt; flag specifies the user, &lt;code&gt;-d&lt;/code&gt; the database, and &lt;code&gt;-h localhost&lt;/code&gt; forces a TCP connection so you can see network behavior. Once inside &lt;strong&gt;psql&lt;/strong&gt;, you can run &lt;code&gt;\l&lt;/code&gt; to list databases and confirm your new database exists.&lt;/p&gt;

&lt;p&gt;For a graphical interface, install &lt;strong&gt;pgAdmin&lt;/strong&gt;. It provides a visual browser of databases, schemas, tables, and query tools while still connecting to the same underlying server. This dual workflow (command line for speed, GUI for exploration) is standard in professional development environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing MySQL
&lt;/h2&gt;

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

&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt; installation follows a similar client-server pattern but uses different binaries and configuration files.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;macOS&lt;/strong&gt; with &lt;strong&gt;Homebrew&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;brew &lt;span class="nb"&gt;install &lt;/span&gt;mysql
brew services start mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On &lt;strong&gt;Ubuntu/Debian&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;mysql-server
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;During installation on Linux, the system creates the &lt;strong&gt;root&lt;/strong&gt; user with a temporary password that you must secure immediately using the &lt;code&gt;mysql_secure_installation&lt;/code&gt; script.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;Windows&lt;/strong&gt;, use the official MySQL Installer and select the &lt;strong&gt;Developer Default&lt;/strong&gt; setup type.&lt;/p&gt;

&lt;h3&gt;
  
  
  MySQL Post-Installation Steps
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt; stores its data in a directory controlled by the &lt;strong&gt;mysqld&lt;/strong&gt; daemon. The main configuration file is &lt;code&gt;my.cnf&lt;/code&gt; (or &lt;code&gt;my.ini&lt;/code&gt; on Windows), where you can later tune buffer sizes and connection limits.&lt;/p&gt;

&lt;p&gt;Verify installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Secure the root user immediately and create a dedicated application user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="s1"&gt;'root'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'localhost'&lt;/span&gt; &lt;span class="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'strong_root_password'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="s1"&gt;'myappuser'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'localhost'&lt;/span&gt; &lt;span class="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'strong_password_here'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;myfirstdb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;myfirstdb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="s1"&gt;'myappuser'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'localhost'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;FLUSH&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connect to your new database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; myappuser &lt;span class="nt"&gt;-p&lt;/span&gt; myfirstdb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-p&lt;/code&gt; flag prompts for the password, keeping it out of command history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MySQL Workbench&lt;/strong&gt; serves as the official graphical client, offering schema design, query execution, and server status monitoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices for Production-Ready Local Setup
&lt;/h2&gt;

&lt;p&gt;Never leave default passwords or the root user exposed in development. Always create application-specific users with the minimum required privileges. On both systems, configure the server to listen only on localhost during development to reduce the attack surface.&lt;/p&gt;

&lt;p&gt;Monitor the server logs early. &lt;strong&gt;PostgreSQL&lt;/strong&gt; logs are in the data directory under &lt;code&gt;log/&lt;/code&gt;, while &lt;strong&gt;MySQL&lt;/strong&gt; uses the error log defined in the configuration file. These logs reveal connection attempts, slow queries, and authentication failures.&lt;/p&gt;

&lt;p&gt;Consider using &lt;strong&gt;Docker&lt;/strong&gt; for repeatable environments in larger projects. A simple Docker Compose setup can spin up isolated &lt;strong&gt;PostgreSQL&lt;/strong&gt; or &lt;strong&gt;MySQL&lt;/strong&gt; containers with version pinning, making your development environment identical across team members and machines.&lt;/p&gt;

&lt;p&gt;Performance implications appear even at this stage: proper data directory placement on SSDs rather than HDDs dramatically affects query speed. Memory allocation in the configuration files determines how much caching the server can perform before hitting disk.&lt;/p&gt;

&lt;p&gt;These foundational choices affect scalability later. A correctly installed and secured &lt;strong&gt;RDBMS&lt;/strong&gt; will support everything from simple prototypes to high-traffic applications without requiring major rework.&lt;/p&gt;

&lt;p&gt;If you want a complete, project-driven SQL learning experience that builds directly on these setup foundations with guided exercises and real application patterns, consider purchasing the &lt;strong&gt;SQL Playbook&lt;/strong&gt; at &lt;a href="https://codewithdhanian.gumroad.com/l/hjmix" rel="noopener noreferrer"&gt;https://codewithdhanian.gumroad.com/l/hjmix&lt;/a&gt;. It provides the structured depth many developers wish they had when starting out.&lt;/p&gt;

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

</description>
      <category>sql</category>
    </item>
    <item>
      <title>Day 1: What is SQL – Databases, Tables, and Relational Concepts</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Sat, 23 May 2026 11:59:28 +0000</pubDate>
      <link>https://dev.to/code_2/day-1-what-is-sql-databases-tables-and-relational-concepts-33a1</link>
      <guid>https://dev.to/code_2/day-1-what-is-sql-databases-tables-and-relational-concepts-33a1</guid>
      <description>&lt;h2&gt;
  
  
  The Foundation of Modern Data Management
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SQL&lt;/strong&gt; stands as the universal language for interacting with relational data. Before writing a single query, it is essential to understand exactly what &lt;strong&gt;SQL&lt;/strong&gt; is, why it exists, and how it sits at the heart of virtually every significant application you use today. &lt;strong&gt;SQL&lt;/strong&gt;, which expands to &lt;strong&gt;Structured Query Language&lt;/strong&gt;, is a declarative programming language designed specifically for managing, organizing, and retrieving data stored in &lt;strong&gt;relational databases&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At its core, &lt;strong&gt;SQL&lt;/strong&gt; allows you to tell a database system what you want rather than how to retrieve it. This declarative nature distinguishes &lt;strong&gt;SQL&lt;/strong&gt; from imperative languages where you must write step-by-step instructions. The database engine handles the optimization, execution plan, and data access internally, freeing developers to focus on business logic instead of low-level file operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a Database?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;database&lt;/strong&gt; is an organized collection of structured data that is stored and accessed electronically. Think of it as a highly efficient digital filing cabinet designed for speed, reliability, and concurrent access by thousands or even millions of users simultaneously.&lt;/p&gt;

&lt;p&gt;Unlike a simple spreadsheet or text file, a production &lt;strong&gt;database&lt;/strong&gt; must satisfy strict requirements: it must maintain &lt;strong&gt;data integrity&lt;/strong&gt;, support &lt;strong&gt;atomic transactions&lt;/strong&gt;, allow &lt;strong&gt;concurrent access&lt;/strong&gt; without corruption, provide &lt;strong&gt;backup and recovery&lt;/strong&gt; mechanisms, and scale as data volumes grow. These capabilities are delivered by specialized software known as a &lt;strong&gt;Relational Database Management System&lt;/strong&gt; (&lt;strong&gt;RDBMS&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;RDBMS&lt;/strong&gt; acts as the intermediary between your application and the raw data files on disk. It manages memory buffers, disk I/O, query optimization, concurrency control through locking and multiversion concurrency control (&lt;strong&gt;MVCC&lt;/strong&gt;), and crash recovery. Popular &lt;strong&gt;RDBMS&lt;/strong&gt; implementations include systems that follow the same fundamental principles you will master in this series.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Relational Model: The Theoretical Backbone
&lt;/h2&gt;

&lt;p&gt;The entire concept of &lt;strong&gt;SQL&lt;/strong&gt; rests on the &lt;strong&gt;relational model&lt;/strong&gt;, first formally defined by Edgar F. Codd. In this model, all data is represented in two-dimensional structures called &lt;strong&gt;tables&lt;/strong&gt; (also known as &lt;strong&gt;relations&lt;/strong&gt;). Each &lt;strong&gt;table&lt;/strong&gt; represents a specific entity or concept in your domain.&lt;/p&gt;

&lt;p&gt;The power of the &lt;strong&gt;relational model&lt;/strong&gt; comes from its mathematical foundation in set theory and predicate logic. This foundation guarantees that data can be combined, filtered, and transformed in predictable, mathematically sound ways. Relationships between &lt;strong&gt;tables&lt;/strong&gt; are expressed through shared values rather than physical pointers, providing flexibility and reducing data duplication.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Principles of Relational Design
&lt;/h3&gt;

&lt;p&gt;Several core rules govern how data should be structured in a &lt;strong&gt;relational database&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Atomicity&lt;/strong&gt;: Each cell in a &lt;strong&gt;table&lt;/strong&gt; holds a single, indivisible value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uniqueness&lt;/strong&gt;: Every row in a &lt;strong&gt;table&lt;/strong&gt; must be uniquely identifiable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Order independence&lt;/strong&gt;: The sequence of rows or columns does not matter; the data is defined by its content and relationships.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt;: All values in a column must belong to the same &lt;strong&gt;data type&lt;/strong&gt; and follow the same rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These principles lead to the practice of &lt;strong&gt;normalization&lt;/strong&gt;, which organizes data to minimize redundancy while preserving relationships. Although we will explore normalization in greater depth later, understanding that it exists helps explain why &lt;strong&gt;SQL&lt;/strong&gt; databases feel so structured and reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tables: The Fundamental Building Blocks
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;table&lt;/strong&gt; is the primary structure where data lives. Each &lt;strong&gt;table&lt;/strong&gt; has a name that should clearly describe the entity it represents, such as &lt;code&gt;users&lt;/code&gt;, &lt;code&gt;orders&lt;/code&gt;, or &lt;code&gt;products&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Inside a &lt;strong&gt;table&lt;/strong&gt; you find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Columns&lt;/strong&gt; (also called &lt;strong&gt;fields&lt;/strong&gt; or &lt;strong&gt;attributes&lt;/strong&gt;): These define the structure and type of data the &lt;strong&gt;table&lt;/strong&gt; can hold. Each &lt;strong&gt;column&lt;/strong&gt; has a name and a specific &lt;strong&gt;data type&lt;/strong&gt; that enforces what kind of information can be stored.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rows&lt;/strong&gt; (also called &lt;strong&gt;records&lt;/strong&gt; or &lt;strong&gt;tuples&lt;/strong&gt;): These are the actual data entries. Each &lt;strong&gt;row&lt;/strong&gt; represents one complete instance of the entity described by the &lt;strong&gt;table&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, consider an e-commerce application. You might have a &lt;strong&gt;products&lt;/strong&gt; &lt;strong&gt;table&lt;/strong&gt; with columns like &lt;code&gt;product_id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;price&lt;/code&gt;, &lt;code&gt;category&lt;/code&gt;, and &lt;code&gt;stock_quantity&lt;/code&gt;. Each &lt;strong&gt;row&lt;/strong&gt; would represent one specific product available for sale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visualizing Table Structure
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;table&lt;/strong&gt; can be imagined as a grid. The column headers define the blueprint, while each subsequent row fills in actual values according to that blueprint. The &lt;strong&gt;RDBMS&lt;/strong&gt; enforces rules at the column level, such as requiring certain columns to be filled (&lt;strong&gt;NOT NULL&lt;/strong&gt;) or ensuring values fall within acceptable ranges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rows, Columns, and Data Relationships
&lt;/h2&gt;

&lt;p&gt;Every &lt;strong&gt;row&lt;/strong&gt; in a &lt;strong&gt;table&lt;/strong&gt; must be uniquely identifiable. This is typically achieved using a &lt;strong&gt;primary key&lt;/strong&gt; — a column or combination of columns whose value is unique for every &lt;strong&gt;row&lt;/strong&gt;. The &lt;strong&gt;primary key&lt;/strong&gt; serves as the definitive address for that record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relationships&lt;/strong&gt; between &lt;strong&gt;tables&lt;/strong&gt; are established using &lt;strong&gt;foreign keys&lt;/strong&gt;. A &lt;strong&gt;foreign key&lt;/strong&gt; in one &lt;strong&gt;table&lt;/strong&gt; references the &lt;strong&gt;primary key&lt;/strong&gt; in another &lt;strong&gt;table&lt;/strong&gt;, creating a logical link. This linkage is what makes the database &lt;strong&gt;relational&lt;/strong&gt; — data in separate &lt;strong&gt;tables&lt;/strong&gt; can be meaningfully connected without duplicating entire records.&lt;/p&gt;

&lt;p&gt;For instance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;code&gt;orders&lt;/code&gt; &lt;strong&gt;table&lt;/strong&gt; might contain a &lt;code&gt;customer_id&lt;/code&gt; column that references the &lt;code&gt;customer_id&lt;/code&gt; &lt;strong&gt;primary key&lt;/strong&gt; in a &lt;code&gt;customers&lt;/code&gt; &lt;strong&gt;table&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;This design allows one customer to place many orders while storing customer details only once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach dramatically reduces data redundancy, improves consistency, and makes complex queries possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SQL and Relational Databases Dominate
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SQL&lt;/strong&gt; combined with the &lt;strong&gt;relational model&lt;/strong&gt; offers several powerful advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Declarative power&lt;/strong&gt;: You describe the desired result, and the &lt;strong&gt;query optimizer&lt;/strong&gt; determines the most efficient way to retrieve it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data integrity&lt;/strong&gt;: Built-in constraints protect against invalid data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standardization&lt;/strong&gt;: &lt;strong&gt;SQL&lt;/strong&gt; is an ANSI/ISO standard, meaning core concepts transfer across different &lt;strong&gt;RDBMS&lt;/strong&gt; implementations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Well-designed &lt;strong&gt;relational databases&lt;/strong&gt; can handle terabytes of data while maintaining performance through proper indexing and query design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaction safety&lt;/strong&gt;: Changes can be grouped into &lt;strong&gt;transactions&lt;/strong&gt; that either fully succeed or fully roll back.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, no technology is perfect. &lt;strong&gt;Relational databases&lt;/strong&gt; can face challenges with extremely high-velocity write workloads or when dealing with highly unstructured data. These limitations have led to the rise of other database types, but for structured business data — finance, e-commerce, healthcare, inventory, user management — the &lt;strong&gt;relational model&lt;/strong&gt; remains the gold standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Developer Perspective
&lt;/h2&gt;

&lt;p&gt;As a software engineer, you will interact with &lt;strong&gt;SQL&lt;/strong&gt; daily. Whether building a new feature, debugging performance issues, or designing a new data model, a deep understanding of these foundational concepts prevents costly mistakes later.&lt;/p&gt;

&lt;p&gt;When designing &lt;strong&gt;tables&lt;/strong&gt;, always ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What entity does this &lt;strong&gt;table&lt;/strong&gt; represent?&lt;/li&gt;
&lt;li&gt;What are the natural relationships to other entities?&lt;/li&gt;
&lt;li&gt;Which columns must be unique?&lt;/li&gt;
&lt;li&gt;What constraints protect data quality?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions guide you toward clean, maintainable database schemas that scale gracefully as your application grows.&lt;/p&gt;

&lt;p&gt;If you are serious about mastering &lt;strong&gt;SQL&lt;/strong&gt; and want a complete hands-on playbook that follows this exact structured learning path with exercises, challenges, and advanced patterns, consider purchasing the SQL Playbook at &lt;a href="https://codewithdhanian.gumroad.com/l/hjmix" rel="noopener noreferrer"&gt;https://codewithdhanian.gumroad.com/l/hjmix&lt;/a&gt;. It is designed to complement this series perfectly.&lt;/p&gt;

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

</description>
      <category>sql</category>
    </item>
    <item>
      <title>Day 1: What is Linux – History, Distributions, and Philosophy</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Tue, 19 May 2026 04:32:02 +0000</pubDate>
      <link>https://dev.to/code_2/day-1-what-is-linux-history-distributions-and-philosophy-hef</link>
      <guid>https://dev.to/code_2/day-1-what-is-linux-history-distributions-and-philosophy-hef</guid>
      <description>&lt;p&gt;Linux is a powerful, open-source operating system kernel that powers everything from smartphones and personal computers to the world's largest supercomputers and cloud servers. At its core, &lt;strong&gt;Linux&lt;/strong&gt; refers specifically to the kernel originally developed by Linus Torvalds. When combined with the tools and utilities from the &lt;strong&gt;GNU Project&lt;/strong&gt;, it forms a complete operating system commonly known as &lt;strong&gt;GNU/Linux&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  The Birth of Linux: A Hobby That Changed the World
&lt;/h3&gt;

&lt;p&gt;In 1991, Linus Torvalds, a Finnish computer science student at the University of Helsinki, grew frustrated with the limitations of existing systems like &lt;strong&gt;Minix&lt;/strong&gt;, a small Unix-like operating system used for educational purposes. Torvalds wanted a free, modifiable system that could run on his Intel 386 personal computer. &lt;/p&gt;

&lt;p&gt;On August 25, 1991, he posted a now-famous message to the comp.os.minix newsgroup:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He released the first version of the kernel, version 0.01, in September 1991. Initially, Torvalds distributed it under a license that restricted commercial use. In 1992, he switched to the &lt;strong&gt;GNU General Public License (GPL)&lt;/strong&gt; version 2. This decision was pivotal: it allowed anyone to view, modify, and distribute the source code, provided that derivative works remained under the same license. This &lt;strong&gt;copyleft&lt;/strong&gt; mechanism ensured that Linux remained free and open forever.&lt;/p&gt;

&lt;p&gt;By combining the &lt;strong&gt;Linux kernel&lt;/strong&gt; with the nearly complete &lt;strong&gt;GNU operating system&lt;/strong&gt; tools (such as the GNU Compiler Collection, Bash shell, and core utilities), developers created a fully functional, free Unix-like operating system. Richard Stallman of the Free Software Foundation has long advocated referring to it as &lt;strong&gt;GNU/Linux&lt;/strong&gt; to acknowledge the essential contributions of the GNU Project.&lt;/p&gt;

&lt;h3&gt;
  
  
  The GNU Project and the Philosophy of Free Software
&lt;/h3&gt;

&lt;p&gt;The foundation of Linux's philosophy traces back to 1983, when &lt;strong&gt;Richard Stallman&lt;/strong&gt; launched the &lt;strong&gt;GNU Project&lt;/strong&gt; ("GNU's Not Unix"). Stallman, a programmer at MIT, witnessed the shift from collaborative software sharing in the 1970s to proprietary, closed-source software in the 1980s. Companies began restricting access to source code, preventing users from studying, modifying, or sharing programs.&lt;/p&gt;

&lt;p&gt;Stallman defined &lt;strong&gt;free software&lt;/strong&gt; through four essential freedoms (often called the "Four Freedoms"):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Freedom 0&lt;/strong&gt;: The freedom to run the program as you wish, for any purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freedom 1&lt;/strong&gt;: The freedom to study how the program works and change it to suit your needs (access to the source code is a precondition).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freedom 2&lt;/strong&gt;: The freedom to redistribute copies so you can help your neighbor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freedom 3&lt;/strong&gt;: The freedom to improve the program and release your improvements to the public so that the whole community benefits (again, source code access is required).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These freedoms emphasize user liberty, not price. "Free" refers to freedom, like free speech, not free beer. The &lt;strong&gt;GNU General Public License (GPL)&lt;/strong&gt; enforces these freedoms through copyleft, ensuring that modified versions remain free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linus Torvalds&lt;/strong&gt; took a more pragmatic approach. He focused on technical excellence and collaboration, viewing open development as the best way to create high-quality software. This blend of Stallman's idealism and Torvalds' pragmatism fueled Linux's explosive growth. Today, thousands of developers worldwide contribute to the kernel through platforms like Git.&lt;/p&gt;

&lt;p&gt;Linux embodies core principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Openness&lt;/strong&gt;: Source code is publicly available.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration&lt;/strong&gt;: Global community-driven development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stability and Security&lt;/strong&gt;: Rigorous peer review reduces bugs and vulnerabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portability&lt;/strong&gt;: Runs on diverse hardware architectures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency&lt;/strong&gt;: Lightweight and highly customizable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Linux Distributions: Flavors for Every Need
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Linux distribution&lt;/strong&gt; (or &lt;strong&gt;distro&lt;/strong&gt;) is a complete operating system built around the Linux kernel, bundled with the GNU tools, a package manager, desktop environment (or lack thereof for servers), and additional software. Distributions make Linux accessible by handling installation, updates, and hardware support.&lt;/p&gt;

&lt;p&gt;Major families of distributions include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debian-based distributions&lt;/strong&gt; use the &lt;code&gt;.deb&lt;/code&gt; package format and the &lt;strong&gt;APT&lt;/strong&gt; package manager. They emphasize stability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Debian&lt;/strong&gt;: The parent distribution, known for rock-solid reliability and vast software repositories. It follows a strict free software philosophy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ubuntu&lt;/strong&gt;: Created by Canonical in 2004, Ubuntu is user-friendly with regular releases (every six months, with Long Term Support versions every two years). It powers many desktops, servers, and cloud instances. Its philosophy prioritizes accessibility and community support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux Mint&lt;/strong&gt;: Built on Ubuntu, Mint focuses on a polished, Windows-like experience with the Cinnamon desktop. It is ideal for beginners transitioning from other operating systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Red Hat-based distributions&lt;/strong&gt; use the &lt;code&gt;.rpm&lt;/code&gt; package format and tools like &lt;strong&gt;YUM&lt;/strong&gt; or &lt;strong&gt;DNF&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fedora&lt;/strong&gt;: Sponsored by Red Hat, Fedora serves as a testing ground for cutting-edge technologies that later appear in enterprise products. It targets developers and enthusiasts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Red Hat Enterprise Linux (RHEL)&lt;/strong&gt;: A commercial distribution with paid support, widely used in business environments for its stability and long support cycles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CentOS Stream&lt;/strong&gt; (and community forks like AlmaLinux and Rocky Linux): Free alternatives providing binary compatibility with RHEL for production servers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other notable distributions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arch Linux&lt;/strong&gt;: A rolling-release distro where users build the system from minimal components. It follows the "keep it simple" philosophy and appeals to advanced users who value customization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gentoo&lt;/strong&gt;: Highly optimized; users compile software from source for maximum performance on their specific hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each distribution balances trade-offs between stability, latest features, ease of use, and target audience. Choosing one depends on your goals—beginner desktop, secure server, or development workstation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding the Linux Ecosystem in Practice
&lt;/h3&gt;

&lt;p&gt;When you install a Linux distribution, you receive more than just the kernel. You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;kernel&lt;/strong&gt; managing hardware, processes, and memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GNU tools&lt;/strong&gt; for core functionality.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;shell&lt;/strong&gt; (usually Bash) for command-line interaction.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;package manager&lt;/strong&gt; for installing and updating software.&lt;/li&gt;
&lt;li&gt;Optional graphical interfaces like GNOME, KDE Plasma, or XFCE.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example of basic system identification commands&lt;/strong&gt; (these will work on almost any Linux system):&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;# View kernel version and system information&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;

&lt;span class="c"&gt;# Display detailed distribution information&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/os-release

&lt;span class="c"&gt;# Check CPU and hardware details&lt;/span&gt;
lscpu
lsblk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands reveal the layered nature of Linux: the kernel at the base, user-space tools above it, and your chosen distribution providing the complete experience.&lt;/p&gt;

&lt;p&gt;Linux's strength lies in its adaptability. You can strip it down to a minimal server or expand it into a full multimedia workstation. Its philosophy of freedom empowers users to own their computing experience rather than being locked into proprietary ecosystems.&lt;/p&gt;

&lt;p&gt;This foundational understanding of Linux's origins, guiding principles, and variety of distributions sets the stage for mastering the system. The collaborative spirit that birthed Linux continues today through millions of users and developers worldwide.&lt;/p&gt;

&lt;p&gt;If you are serious about achieving true Linux mastery—from beginner commands to advanced administration, security, scripting, and production server deployment—consider investing in a comprehensive resource. The &lt;strong&gt;Linux Mastery Ebook&lt;/strong&gt; available at &lt;a href="https://codewithdhanian.gumroad.com/l/hqtbxt" rel="noopener noreferrer"&gt;https://codewithdhanian.gumroad.com/l/hqtbxt&lt;/a&gt; provides structured, hands-on guidance that builds directly on these fundamentals and takes you far beyond them.&lt;/p&gt;

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

</description>
      <category>linux</category>
    </item>
    <item>
      <title>CONCEPT 1: Linux Installation Methods (Dual Boot, VM, Bare Metal)</title>
      <dc:creator>CodeWithDhanian</dc:creator>
      <pubDate>Mon, 18 May 2026 13:20:14 +0000</pubDate>
      <link>https://dev.to/code_2/concept-1-linux-installation-methods-dual-boot-vm-bare-metal-eg0</link>
      <guid>https://dev.to/code_2/concept-1-linux-installation-methods-dual-boot-vm-bare-metal-eg0</guid>
      <description>&lt;p&gt;Choosing how to install &lt;strong&gt;Linux&lt;/strong&gt; is one of the most foundational decisions a system administrator, developer, or enthusiast will make. The installation method directly influences performance, isolation, hardware access, ease of experimentation, and long-term maintainability. The three primary approaches—&lt;strong&gt;bare metal&lt;/strong&gt;, &lt;strong&gt;virtual machine (VM)&lt;/strong&gt;, and &lt;strong&gt;dual boot&lt;/strong&gt;—each solve different problems and come with distinct trade-offs in architecture, workflow, and operational behavior.&lt;/p&gt;

&lt;p&gt;This chapter explores each method in depth, from the underlying system architecture to practical implementation, real-world engineering considerations, and advanced usage patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Installation Landscape
&lt;/h2&gt;

&lt;p&gt;At its core, installing &lt;strong&gt;Linux&lt;/strong&gt; means placing a functional &lt;strong&gt;kernel&lt;/strong&gt;, &lt;strong&gt;init system&lt;/strong&gt; (most commonly &lt;strong&gt;systemd&lt;/strong&gt;), &lt;strong&gt;root filesystem&lt;/strong&gt;, and necessary &lt;strong&gt;userspace&lt;/strong&gt; tools onto a storage medium that the &lt;strong&gt;bootloader&lt;/strong&gt; can locate and execute.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Linux kernel&lt;/strong&gt; is a monolithic kernel that interacts directly with hardware through &lt;strong&gt;drivers&lt;/strong&gt; compiled either statically or as loadable &lt;strong&gt;kernel modules&lt;/strong&gt;. The &lt;strong&gt;bootloader&lt;/strong&gt; (typically &lt;strong&gt;GRUB&lt;/strong&gt;) is responsible for loading the kernel image (&lt;code&gt;vmlinuz&lt;/code&gt;), initial ramdisk (&lt;code&gt;initrd&lt;/code&gt; or &lt;code&gt;initramfs&lt;/code&gt;), and passing kernel parameters.&lt;/p&gt;

&lt;p&gt;Each installation method changes where and how this stack executes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bare metal&lt;/strong&gt; runs the kernel directly on physical CPU, memory, and devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtual machine&lt;/strong&gt; runs the kernel inside a hypervisor-managed environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dual boot&lt;/strong&gt; shares physical hardware between two operating systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bare Metal Installation: Maximum Performance and Direct Hardware Control
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bare metal&lt;/strong&gt; installation means &lt;strong&gt;Linux&lt;/strong&gt; runs natively on the physical hardware without any abstraction layer between the kernel and the CPU, memory, storage controllers, or peripherals.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Choose Bare Metal?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bare metal&lt;/strong&gt; delivers the highest possible performance because there is zero hypervisor overhead. All CPU cycles, memory bandwidth, and I/O operations go directly to your &lt;strong&gt;Linux&lt;/strong&gt; environment. This approach is preferred for production servers, high-performance computing, gaming desktops, audio/video workstations, and any workload where latency or throughput is critical.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hardware Preparation and UEFI vs BIOS
&lt;/h3&gt;

&lt;p&gt;Modern systems use &lt;strong&gt;UEFI&lt;/strong&gt; (Unified Extensible Firmware Interface) with &lt;strong&gt;GPT&lt;/strong&gt; partitioning. Legacy systems may still use &lt;strong&gt;BIOS&lt;/strong&gt; with &lt;strong&gt;MBR&lt;/strong&gt;. During installation, you must decide on an &lt;strong&gt;EFI System Partition (ESP)&lt;/strong&gt; formatted as FAT32 (typically 512 MiB) mounted at &lt;code&gt;/boot/efi&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A recommended bare metal partition layout for a production system might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/dev/nvme0n1p1     512M     FAT32     /boot/efi     (ESP)
/dev/nvme0n1p2     1G       ext4      /boot
/dev/nvme0n1p3     remaining space    LVM physical volume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;LVM&lt;/strong&gt; (Logical Volume Manager) is strongly recommended because it allows online resizing of logical volumes without downtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-by-Step Bare Metal Installation Process
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create bootable media using &lt;code&gt;dd&lt;/code&gt;, Rufus, or Ventoy.&lt;/li&gt;
&lt;li&gt;Boot from the media and enter the live environment.&lt;/li&gt;
&lt;li&gt;Partition disks using &lt;code&gt;gdisk&lt;/code&gt;, &lt;code&gt;fdisk&lt;/code&gt;, or the distribution installer.&lt;/li&gt;
&lt;li&gt;Format partitions (&lt;code&gt;mkfs.ext4&lt;/code&gt;, &lt;code&gt;mkfs.fat&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;Mount the target filesystem hierarchy under &lt;code&gt;/mnt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;debootstrap&lt;/code&gt;, &lt;code&gt;pacstrap&lt;/code&gt;, or the graphical installer to populate the root filesystem.&lt;/li&gt;
&lt;li&gt;Generate &lt;code&gt;fstab&lt;/code&gt;, chroot into the new system, install the bootloader, and configure networking.&lt;/li&gt;
&lt;li&gt;Reboot and remove installation media.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Advanced Considerations
&lt;/h3&gt;

&lt;p&gt;On bare metal, you have full control over &lt;strong&gt;kernel parameters&lt;/strong&gt; passed via GRUB (&lt;code&gt;quiet splash&lt;/code&gt;, &lt;code&gt;mitigations=off&lt;/code&gt;, &lt;code&gt;iommu=pt&lt;/code&gt;). You can compile a custom kernel tailored to your hardware, enable specific &lt;strong&gt;CPU features&lt;/strong&gt; (AVX512, huge pages), and optimize &lt;strong&gt;I/O schedulers&lt;/strong&gt; (&lt;code&gt;mq-deadline&lt;/code&gt;, &lt;code&gt;bfq&lt;/code&gt;, or &lt;code&gt;none&lt;/code&gt; for NVMe).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt;: No easy rollback. Hardware failures affect the entire system. Testing new distributions requires physical hardware or reinstallation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Virtual Machine Installation: Isolation, Flexibility, and Rapid Experimentation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Virtual machines&lt;/strong&gt; run &lt;strong&gt;Linux&lt;/strong&gt; inside a hypervisor such as &lt;strong&gt;KVM/QEMU&lt;/strong&gt;, &lt;strong&gt;VirtualBox&lt;/strong&gt;, &lt;strong&gt;VMware&lt;/strong&gt;, or &lt;strong&gt;Hyper-V&lt;/strong&gt;. The hypervisor presents virtualized hardware (vCPU, vRAM, virtio devices) to the guest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture of Modern Virtualization
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;KVM&lt;/strong&gt; (Kernel-based Virtual Machine) turns the &lt;strong&gt;Linux&lt;/strong&gt; kernel into a hypervisor by loading the &lt;code&gt;kvm&lt;/code&gt; and &lt;code&gt;kvm-intel&lt;/code&gt;/&lt;code&gt;kvm-amd&lt;/code&gt; modules. &lt;strong&gt;QEMU&lt;/strong&gt; provides device emulation, while &lt;strong&gt;virtio&lt;/strong&gt; drivers deliver near-native performance for block, network, and graphics devices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;libvirt&lt;/strong&gt; acts as a management layer, providing a unified API for creating, starting, and monitoring virtual machines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a High-Performance Linux VM
&lt;/h3&gt;

&lt;p&gt;Here is a complete example using &lt;code&gt;virt-install&lt;/code&gt; (recommended for production-grade VMs):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;virt-install &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; ubuntu-server-24 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--ram&lt;/span&gt; 8192 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--vcpus&lt;/span&gt; 8 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cpu&lt;/span&gt; host-passthrough &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--disk&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/lib/libvirt/images/ubuntu24.qcow2,size&lt;span class="o"&gt;=&lt;/span&gt;80,format&lt;span class="o"&gt;=&lt;/span&gt;qcow2,bus&lt;span class="o"&gt;=&lt;/span&gt;virtio &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; &lt;span class="nv"&gt;network&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;default,model&lt;span class="o"&gt;=&lt;/span&gt;virtio &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--graphics&lt;/span&gt; none &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--console&lt;/span&gt; pty,target_type&lt;span class="o"&gt;=&lt;/span&gt;serial &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--location&lt;/span&gt; https://releases.ubuntu.com/24.04/ubuntu-24.04-live-server-amd64.iso &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--extra-args&lt;/span&gt; &lt;span class="s1"&gt;'console=ttyS0,115200n8'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key options explained&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--cpu host-passthrough&lt;/code&gt;: Exposes the full host CPU capabilities to the guest for maximum performance.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;virtio&lt;/code&gt; drivers: Paravirtualized devices that bypass much of the emulation overhead.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;qcow2&lt;/code&gt; format: Supports snapshots, compression, and thin provisioning.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Advanced VM Techniques
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PCI passthrough&lt;/strong&gt;: Assign physical GPUs, NICs, or storage controllers directly to the VM using &lt;strong&gt;VFIO&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nested virtualization&lt;/strong&gt;: Run VMs inside VMs (useful for testing &lt;strong&gt;Kubernetes&lt;/strong&gt; clusters).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live migration&lt;/strong&gt;: Move running VMs between hosts with zero downtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;: Snapshots, easy cloning, hardware independence, and the ability to run multiple distributions simultaneously.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Limitations&lt;/strong&gt;: Slight performance overhead (typically 2-10% for CPU-bound tasks, higher for I/O without virtio). Resource contention on the host.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dual Boot: Sharing Physical Hardware Between Operating Systems
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Dual boot&lt;/strong&gt; allows both &lt;strong&gt;Linux&lt;/strong&gt; and another OS (usually &lt;strong&gt;Windows&lt;/strong&gt;) to coexist on the same physical machine, with the &lt;strong&gt;bootloader&lt;/strong&gt; presenting a choice at startup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bootloader Architecture in Dual Boot
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GRUB&lt;/strong&gt; is installed to the &lt;strong&gt;EFI System Partition&lt;/strong&gt; and configured to detect other operating systems via &lt;code&gt;os-prober&lt;/code&gt;. The chainloading mechanism works as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;UEFI firmware loads &lt;code&gt;GRUB.efi&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;GRUB reads its configuration (&lt;code&gt;/boot/grub/grub.cfg&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Menu is displayed with entries for Linux and Windows.&lt;/li&gt;
&lt;li&gt;Selecting Windows chainloads the &lt;strong&gt;Windows Boot Manager&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Safe Dual Boot Installation Strategy
&lt;/h3&gt;

&lt;p&gt;Always install &lt;strong&gt;Windows&lt;/strong&gt; first. Windows will claim the entire disk and create its own partitions (EFI, MSR, Windows, Recovery). Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Shrink the Windows partition from within Windows using Disk Management or &lt;code&gt;diskpart&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Boot from Linux media.&lt;/li&gt;
&lt;li&gt;Install Linux into the unallocated space.&lt;/li&gt;
&lt;li&gt;Let the Linux installer install &lt;strong&gt;GRUB&lt;/strong&gt; to the EFI partition (it will automatically detect Windows).&lt;/li&gt;
&lt;li&gt;Update GRUB configuration: &lt;code&gt;sudo update-grub&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Common Challenges and Solutions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast Startup&lt;/strong&gt; in Windows can leave NTFS partitions in an inconsistent state. Disable it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time synchronization&lt;/strong&gt;: Windows uses local time, Linux uses UTC. Set Linux to use local time or Windows to use UTC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Boot&lt;/strong&gt;: Sign your custom kernels or use distribution-provided signed bootloaders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared data partition&lt;/strong&gt;: Create an NTFS or exFAT partition accessible by both systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;: Native performance for both OSes, access to hardware-specific applications.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Limitations&lt;/strong&gt;: Risk of bootloader corruption, difficulty in resizing partitions later, and inability to run both OSes simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the Right Method: Decision Framework
&lt;/h2&gt;

&lt;p&gt;Consider these factors when deciding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance needs&lt;/strong&gt;: Bare metal for maximum speed, VM for acceptable performance with isolation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experimentation frequency&lt;/strong&gt;: VM wins for rapid testing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware availability&lt;/strong&gt;: Dual boot or bare metal when you have dedicated machines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production requirements&lt;/strong&gt;: Bare metal or Type-1 hypervisor (KVM) for servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development workflow&lt;/strong&gt;: Many engineers maintain a bare metal workstation for daily work and multiple VMs for isolated testing environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best practice&lt;/strong&gt;: Start with a &lt;strong&gt;virtual machine&lt;/strong&gt; to learn safely, move to &lt;strong&gt;dual boot&lt;/strong&gt; for daily driver usage, and deploy to &lt;strong&gt;bare metal&lt;/strong&gt; for production workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Engineering Workflows
&lt;/h2&gt;

&lt;p&gt;Professional Linux users often combine methods. A common setup includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bare metal host running &lt;strong&gt;KVM&lt;/strong&gt; + &lt;strong&gt;libvirt&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Multiple specialized VMs (development, testing, CI/CD).&lt;/li&gt;
&lt;li&gt;Physical dual-boot machine for graphics-intensive work.&lt;/li&gt;
&lt;li&gt;Cloud instances for additional capacity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This hybrid approach provides both performance and flexibility.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>linux</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
