<?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>Forem: Ankit Silwal</title>
    <description>The latest articles on Forem by Ankit Silwal (@ankitsilwal).</description>
    <link>https://forem.com/ankitsilwal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3604462%2Ff7c04c65-3671-45fb-9cba-13ed3d9361ed.png</url>
      <title>Forem: Ankit Silwal</title>
      <link>https://forem.com/ankitsilwal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ankitsilwal"/>
    <language>en</language>
    <item>
      <title>Express JS</title>
      <dc:creator>Ankit Silwal</dc:creator>
      <pubDate>Tue, 11 Nov 2025 11:58:47 +0000</pubDate>
      <link>https://forem.com/ankitsilwal/express-js-1j1p</link>
      <guid>https://forem.com/ankitsilwal/express-js-1j1p</guid>
      <description>&lt;p&gt;🎯 Overview&lt;/p&gt;

&lt;p&gt;Welcome to "From Zero to Backend Hero", a complete hands-on roadmap designed to take you from absolute beginner to backend developer using Node.js + Express.js.&lt;/p&gt;

&lt;p&gt;Each phase combines:&lt;/p&gt;

&lt;p&gt;📘 Detailed concepts&lt;/p&gt;

&lt;p&gt;🧩 Mini-project milestones&lt;/p&gt;

&lt;p&gt;🔁 Refactor &amp;amp; improvement goals&lt;/p&gt;

&lt;p&gt;💡 Optional challenges to deepen understanding&lt;/p&gt;

&lt;p&gt;This journey is project-oriented, meaning every topic will end with code you can run, test, and improve.&lt;/p&gt;

&lt;p&gt;🧱 Phase 1: Core Fundamentals&lt;/p&gt;

&lt;p&gt;Goal: Understand how web servers, HTTP requests, and responses work.&lt;/p&gt;

&lt;p&gt;📚 What You’ll Learn&lt;/p&gt;

&lt;p&gt;What Node.js is and why Express.js makes it powerful&lt;/p&gt;

&lt;p&gt;Setting up a Node project using&lt;/p&gt;

&lt;p&gt;npm init -y&lt;br&gt;
npm install express nodemon&lt;/p&gt;

&lt;p&gt;Running a dev server with npm run start:dev&lt;/p&gt;

&lt;p&gt;Understanding HTTP (requests, responses, status codes, methods)&lt;/p&gt;

&lt;p&gt;How the browser (client) talks to your Express server&lt;/p&gt;

&lt;p&gt;🧩 Mini Project: express-basics-api&lt;/p&gt;

&lt;p&gt;Build a simple Express server that:&lt;/p&gt;

&lt;p&gt;Runs on port 3000&lt;/p&gt;

&lt;p&gt;Routes:&lt;/p&gt;

&lt;p&gt;/ → returns "Server is running..."&lt;/p&gt;

&lt;p&gt;/api/info → returns app info in JSON&lt;/p&gt;

&lt;p&gt;Uses nodemon for auto restart&lt;/p&gt;

&lt;p&gt;Reads port from environment variables (process.env.PORT)&lt;/p&gt;

&lt;p&gt;import express from "express";&lt;br&gt;
import dotenv from "dotenv";&lt;br&gt;
dotenv.config();&lt;/p&gt;

&lt;p&gt;const app = express();&lt;br&gt;
const PORT = process.env.PORT || 3000;&lt;/p&gt;

&lt;p&gt;app.get("/", (req, res) =&amp;gt; res.send("Server is running..."));&lt;br&gt;
app.get("/api/info", (req, res) =&amp;gt; res.json({ app: "express-basics-api", status: "active" }));&lt;/p&gt;

&lt;p&gt;app.listen(PORT, () =&amp;gt; console.log(&lt;code&gt;Server listening on port ${PORT}&lt;/code&gt;));&lt;/p&gt;

&lt;p&gt;💡 Improvements&lt;/p&gt;

&lt;p&gt;Add /health route that returns system uptime and timestamp&lt;/p&gt;

&lt;p&gt;Use dotenv for environment configuration&lt;/p&gt;

&lt;p&gt;Enable ES Modules ("type": "module" in package.json)&lt;/p&gt;

&lt;p&gt;🌐 Phase 2: Basic Routing &amp;amp; Data Retrieval (GET)&lt;/p&gt;

&lt;p&gt;Goal: Learn Express routing and dynamic data serving.&lt;/p&gt;

&lt;p&gt;📚 What You’ll Learn&lt;/p&gt;

&lt;p&gt;Defining routes with app.get()&lt;/p&gt;

&lt;p&gt;Using req and res objects&lt;/p&gt;

&lt;p&gt;Handling route parameters (/api/users/:id)&lt;/p&gt;

&lt;p&gt;Using query strings (?filter=name&amp;amp;value=john)&lt;/p&gt;

&lt;p&gt;Handling invalid inputs (400/404 errors)&lt;/p&gt;

&lt;p&gt;🧩 Mini Project: user-directory-api&lt;/p&gt;

&lt;p&gt;Endpoints:&lt;/p&gt;

&lt;p&gt;GET /api/users → return all mock users&lt;/p&gt;

&lt;p&gt;GET /api/users/:id → return a single user&lt;/p&gt;

&lt;p&gt;GET /api/users?filter=name&amp;amp;value=john → filter users by name&lt;/p&gt;

&lt;p&gt;💡 Improvements&lt;/p&gt;

&lt;p&gt;Validate numeric IDs&lt;/p&gt;

&lt;p&gt;Add /api/products endpoint&lt;/p&gt;

&lt;p&gt;Use modular functions (getAllUsers, getUserById)&lt;/p&gt;

&lt;p&gt;✏️ Phase 3: CRUD Operations (POST, PUT, PATCH, DELETE)&lt;/p&gt;

&lt;p&gt;Goal: Implement full CRUD — create, read, update, and delete users.&lt;/p&gt;

&lt;p&gt;📚 What You’ll Learn&lt;/p&gt;

&lt;p&gt;Handling POST, PUT, PATCH, DELETE requests&lt;/p&gt;

&lt;p&gt;Using express.json() to parse JSON&lt;/p&gt;

&lt;p&gt;Working with request payloads&lt;/p&gt;

&lt;p&gt;Returning correct status codes&lt;/p&gt;

&lt;p&gt;🧩 Mini Project: crud-users-api&lt;/p&gt;

&lt;p&gt;Endpoints:&lt;/p&gt;

&lt;p&gt;POST /api/users → Create new user&lt;/p&gt;

&lt;p&gt;PUT /api/users/:id → Replace existing user&lt;/p&gt;

&lt;p&gt;PATCH /api/users/:id → Update part of user&lt;/p&gt;

&lt;p&gt;DELETE /api/users/:id → Remove user&lt;/p&gt;

&lt;p&gt;💡 Improvements&lt;/p&gt;

&lt;p&gt;Add validation logic for all fields&lt;/p&gt;

&lt;p&gt;Use helper functions for user lookup&lt;/p&gt;

&lt;p&gt;Return 201 for creation, 204 for deletion&lt;/p&gt;

&lt;p&gt;⚙️ Phase 4: Middleware and Validation&lt;/p&gt;

&lt;p&gt;Goal: Learn middleware — the backbone of Express — and add validation.&lt;/p&gt;

&lt;p&gt;📚 What You’ll Learn&lt;/p&gt;

&lt;p&gt;Creating custom middleware (req, res, next)&lt;/p&gt;

&lt;p&gt;The next() function and middleware chaining&lt;/p&gt;

&lt;p&gt;Global vs route-level middleware&lt;/p&gt;

&lt;p&gt;Validation with express-validator and checkSchema()&lt;/p&gt;

&lt;p&gt;🧩 Mini Project: validated-users-api&lt;/p&gt;

&lt;p&gt;Middleware for:&lt;/p&gt;

&lt;p&gt;Valid user ID checking&lt;/p&gt;

&lt;p&gt;Handling 400/404 errors&lt;/p&gt;

&lt;p&gt;Validation schema for user creation&lt;/p&gt;

&lt;p&gt;💡 Improvements&lt;/p&gt;

&lt;p&gt;Move validation into middlewares/validation.js&lt;/p&gt;

&lt;p&gt;Add centralized error handler&lt;/p&gt;

&lt;p&gt;Return structured JSON error responses&lt;/p&gt;

&lt;p&gt;🗂️ Phase 5: Express Router &amp;amp; Modular Architecture&lt;/p&gt;

&lt;p&gt;Goal: Organize growing APIs like a professional.&lt;/p&gt;

&lt;p&gt;📚 What You’ll Learn&lt;/p&gt;

&lt;p&gt;Express Router for modular structure&lt;/p&gt;

&lt;p&gt;Creating route files for each module&lt;/p&gt;

&lt;p&gt;Importing and registering routers&lt;/p&gt;

&lt;p&gt;🧩 Mini Project: modular-api&lt;/p&gt;

&lt;p&gt;Folder Structure:&lt;/p&gt;

&lt;p&gt;routes/&lt;br&gt;
  users.mjs&lt;br&gt;
  products.mjs&lt;br&gt;
utils/&lt;br&gt;
  constants.mjs&lt;br&gt;
index.mjs&lt;/p&gt;

&lt;p&gt;💡 Improvements&lt;/p&gt;

&lt;p&gt;Add controllers/ folder for logic separation&lt;/p&gt;

&lt;p&gt;Add logger middleware for request tracking&lt;/p&gt;

&lt;p&gt;🍪 Phase 6: Cookies &amp;amp; Sessions&lt;/p&gt;

&lt;p&gt;Goal: Handle user sessions and stateful authentication.&lt;/p&gt;

&lt;p&gt;📚 What You’ll Learn&lt;/p&gt;

&lt;p&gt;Setting and reading cookies&lt;/p&gt;

&lt;p&gt;Using cookie-parser&lt;/p&gt;

&lt;p&gt;Session management with express-session&lt;/p&gt;

&lt;p&gt;Building session-based cart&lt;/p&gt;

&lt;p&gt;🧩 Mini Project: auth-cart-api&lt;/p&gt;

&lt;p&gt;Endpoints:&lt;/p&gt;

&lt;p&gt;POST /api/auth/login → start session&lt;/p&gt;

&lt;p&gt;GET /api/cart → return user cart&lt;/p&gt;

&lt;p&gt;POST /api/cart/add → add items&lt;/p&gt;

&lt;p&gt;💡 Improvements&lt;/p&gt;

&lt;p&gt;Add session expiry logic&lt;/p&gt;

&lt;p&gt;Middleware for authentication protection&lt;/p&gt;

&lt;p&gt;🔐 Phase 7: Authentication, Database &amp;amp; Security&lt;/p&gt;

&lt;p&gt;Goal: Build production-ready secure APIs.&lt;/p&gt;

&lt;p&gt;📚 What You’ll Learn&lt;/p&gt;

&lt;p&gt;Passport.js (Local + OAuth)&lt;/p&gt;

&lt;p&gt;Mongoose for MongoDB&lt;/p&gt;

&lt;p&gt;Password hashing with bcrypt&lt;/p&gt;

&lt;p&gt;Persistent sessions using connect-mongo&lt;/p&gt;

&lt;p&gt;🧩 Mini Project: secure-auth-api&lt;/p&gt;

&lt;p&gt;Local login/register with Passport Local Strategy&lt;/p&gt;

&lt;p&gt;Password hashing and verification&lt;/p&gt;

&lt;p&gt;MongoDB persistence&lt;/p&gt;

&lt;p&gt;Session store in MongoDB&lt;/p&gt;

&lt;p&gt;💡 Improvements&lt;/p&gt;

&lt;p&gt;Add role-based access control&lt;/p&gt;

&lt;p&gt;OAuth login with Google/Discord&lt;/p&gt;

&lt;p&gt;Secure all endpoints with middleware&lt;/p&gt;

&lt;p&gt;🧪 Phase 8: Testing (Unit, Integration, E2E)&lt;/p&gt;

&lt;p&gt;Goal: Ensure your API is robust, reliable, and production-ready.&lt;/p&gt;

&lt;p&gt;📚 What You’ll Learn&lt;/p&gt;

&lt;p&gt;Unit testing with Jest&lt;/p&gt;

&lt;p&gt;Integration testing with Supertest&lt;/p&gt;

&lt;p&gt;Mocking dependencies&lt;/p&gt;

&lt;p&gt;Test database setup&lt;/p&gt;

&lt;p&gt;🧩 Mini Project: tested-api&lt;/p&gt;

&lt;p&gt;Tests:&lt;/p&gt;

&lt;p&gt;Unit tests for handlers&lt;/p&gt;

&lt;p&gt;Integration tests for POST /api/users&lt;/p&gt;

&lt;p&gt;E2E tests: login → add to cart → get cart&lt;/p&gt;

&lt;p&gt;💡 Improvements&lt;/p&gt;

&lt;p&gt;Generate coverage reports&lt;/p&gt;

&lt;p&gt;Automate tests with GitHub Actions&lt;/p&gt;

&lt;p&gt;Add .env.test environment&lt;/p&gt;

&lt;p&gt;🎓 Final Phase: Capstone Project — NodeVault API&lt;/p&gt;

&lt;p&gt;Combine everything you’ve learned into one professional-grade API.&lt;/p&gt;

&lt;p&gt;🏗️ Features&lt;/p&gt;

&lt;p&gt;✅ Authentication (Passport + Sessions)&lt;br&gt;
✅ MongoDB + Mongoose persistence&lt;br&gt;
✅ Validation &amp;amp; Error Handling&lt;br&gt;
✅ Modular Routers &amp;amp; Controllers&lt;br&gt;
✅ Password Hashing + Cookies&lt;br&gt;
✅ Unit &amp;amp; Integration Testing&lt;br&gt;
✅ Optional: OAuth Login&lt;/p&gt;

&lt;p&gt;🌟 Conclusion&lt;/p&gt;

&lt;p&gt;You now have a roadmap to go from zero to backend hero.&lt;br&gt;
Each phase builds directly on the last — by the end, you’ll have:&lt;/p&gt;

&lt;p&gt;A complete backend portfolio project&lt;/p&gt;

&lt;p&gt;Real-world Express.js experience&lt;/p&gt;

&lt;p&gt;A professional-level understanding of Node.js APIs&lt;br&gt;
**&lt;/p&gt;
&lt;h3&gt;
  
  
  Phase 1:
&lt;/h3&gt;

&lt;p&gt;**&lt;br&gt;
🧱 Phase 1: Project Setup and HTTP Fundamentals (Full Beginner Explanation)&lt;br&gt;
🌍 What Are We Learning in This Phase?&lt;/p&gt;

&lt;p&gt;By the end of this phase, you’ll know:&lt;/p&gt;

&lt;p&gt;What Node.js and Express.js are.&lt;/p&gt;

&lt;p&gt;How to set up a backend project from scratch.&lt;/p&gt;

&lt;p&gt;How web servers actually work (clients, requests, and responses).&lt;/p&gt;

&lt;p&gt;What each core Express function (app.get, app.listen, etc.) does.&lt;/p&gt;

&lt;p&gt;How to build and run your first server.&lt;/p&gt;

&lt;p&gt;🧠 Step 1: Understanding Node.js&lt;br&gt;
What it is:&lt;/p&gt;

&lt;p&gt;Node.js is a runtime environment that allows you to execute JavaScript code outside the browser.&lt;/p&gt;

&lt;p&gt;Normally, JavaScript only runs in browsers (like Chrome or Firefox).&lt;br&gt;
But Node.js brings that power to your computer — letting you build servers, APIs, and tools using JavaScript.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;p&gt;🧠 Browser JS → Makes buttons click, forms submit&lt;br&gt;
⚙️ Node.js JS → Handles server logic, databases, file storage&lt;/p&gt;

&lt;p&gt;So, Node.js = JavaScript for the backend.&lt;/p&gt;

&lt;p&gt;🚂 Step 2: Understanding Express.js&lt;/p&gt;

&lt;p&gt;Express.js is a framework built on top of Node.js.&lt;/p&gt;

&lt;p&gt;What is a framework?&lt;/p&gt;

&lt;p&gt;A framework gives you ready-made tools to make complex things easier.&lt;/p&gt;

&lt;p&gt;Without Express, to build a server, you’d have to manually write:&lt;/p&gt;

&lt;p&gt;Request parsing&lt;/p&gt;

&lt;p&gt;Route handling&lt;/p&gt;

&lt;p&gt;Response formatting&lt;/p&gt;

&lt;p&gt;Express simplifies all of that.&lt;/p&gt;

&lt;p&gt;Analogy:&lt;/p&gt;

&lt;p&gt;Without Express = You build a car from scratch (engine, wheels, doors).&lt;br&gt;
With Express = You just design the dashboard — the engine’s already there.&lt;/p&gt;

&lt;p&gt;⚙️ Step 3: Setting Up the Project&lt;br&gt;
What you do in the terminal:&lt;br&gt;
mkdir express-basics-api&lt;br&gt;
cd express-basics-api&lt;br&gt;
npm init -y&lt;/p&gt;

&lt;p&gt;🧩 Explanation:&lt;/p&gt;

&lt;p&gt;mkdir → Makes a new folder&lt;/p&gt;

&lt;p&gt;cd → Enters that folder&lt;/p&gt;

&lt;p&gt;npm init -y → Initializes a Node project and creates a package.json file&lt;/p&gt;

&lt;p&gt;📦 Step 4: Installing Dependencies&lt;br&gt;
Install Express:&lt;br&gt;
npm install express&lt;/p&gt;

&lt;p&gt;This downloads Express.js and saves it as a dependency in your package.json.&lt;/p&gt;

&lt;p&gt;Install Nodemon (developer tool):&lt;br&gt;
npm install --save-dev nodemon&lt;/p&gt;

&lt;p&gt;Nodemon automatically restarts your app when you change code — super useful for development.&lt;/p&gt;

&lt;p&gt;⚙️ Step 5: Configuring package.json&lt;/p&gt;

&lt;p&gt;Open package.json, find the "scripts" section, and replace it with:&lt;/p&gt;

&lt;p&gt;"scripts": {&lt;br&gt;
  "start": "node index.mjs",&lt;br&gt;
  "start:dev": "nodemon index.mjs"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;🧩 Explanation:&lt;/p&gt;

&lt;p&gt;"start" → runs your app normally.&lt;/p&gt;

&lt;p&gt;"start:dev" → runs your app using nodemon (auto restart).&lt;/p&gt;

&lt;p&gt;You’ll run your app using:&lt;/p&gt;

&lt;p&gt;npm run start:dev&lt;/p&gt;

&lt;p&gt;💡 Step 6: Enabling Modern JavaScript (ES Modules)&lt;/p&gt;

&lt;p&gt;By default, Node.js uses an older system (require and module.exports),&lt;br&gt;
but we want to use the modern import/export syntax.&lt;/p&gt;

&lt;p&gt;To enable that, add this to your package.json:&lt;/p&gt;

&lt;p&gt;"type": "module"&lt;/p&gt;

&lt;p&gt;Now you can use:&lt;/p&gt;

&lt;p&gt;import express from "express";&lt;/p&gt;

&lt;p&gt;instead of:&lt;/p&gt;

&lt;p&gt;const express = require("express");&lt;/p&gt;

&lt;p&gt;📁 Step 7: Create Entry File&lt;/p&gt;

&lt;p&gt;Create your main file:&lt;/p&gt;

&lt;p&gt;touch index.mjs&lt;/p&gt;

&lt;p&gt;🧩 Step 8: Core Express Concepts Explained&lt;/p&gt;

&lt;p&gt;Now let’s slowly build the server and explain every single line.&lt;/p&gt;

&lt;p&gt;🔹 1. Importing Express&lt;br&gt;
import express from "express";&lt;/p&gt;

&lt;p&gt;🧩 What this means:&lt;br&gt;
You are importing the Express library that you installed earlier.&lt;br&gt;
This gives you access to all of Express’s features.&lt;/p&gt;

&lt;p&gt;It’s like saying:&lt;/p&gt;

&lt;p&gt;“Hey Express, I want to use your toolkit to build my server.”&lt;/p&gt;

&lt;p&gt;🔹 2. Creating an Express Application&lt;br&gt;
const app = express();&lt;/p&gt;

&lt;p&gt;🧩 Explanation:&lt;br&gt;
This creates an application object, often called app.&lt;/p&gt;

&lt;p&gt;Think of app as your entire web server — it will handle:&lt;/p&gt;

&lt;p&gt;Routes (/users, /products, etc.)&lt;/p&gt;

&lt;p&gt;Middleware (authentication, validation)&lt;/p&gt;

&lt;p&gt;Responses (sending data back to users)&lt;/p&gt;

&lt;p&gt;Every route, middleware, and response you define will go through app.&lt;/p&gt;

&lt;p&gt;🔹 3. Setting a Port&lt;br&gt;
const PORT = process.env.PORT || 3000;&lt;/p&gt;

&lt;p&gt;🧩 Explanation:&lt;br&gt;
The port is like the door number your server listens on.&lt;/p&gt;

&lt;p&gt;process.env.PORT → checks if there’s a port number from the environment (useful in production).&lt;/p&gt;

&lt;p&gt;|| 3000 → if no port is defined, use port 3000 by default.&lt;/p&gt;

&lt;p&gt;🔹 4. Handling Routes (app.get)&lt;br&gt;
app.get("/", (req, res) =&amp;gt; {&lt;br&gt;
  res.send("🚀 Server is running...");&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🧩 Breakdown:&lt;/p&gt;

&lt;p&gt;app.get() → defines a route that responds to GET requests (used to fetch data).&lt;/p&gt;

&lt;p&gt;"/" → the path. / means the root URL (like homepage).&lt;/p&gt;

&lt;p&gt;(req, res) → two parameters Express provides:&lt;/p&gt;

&lt;p&gt;req = request object (contains info about what client sent)&lt;/p&gt;

&lt;p&gt;res = response object (you use this to reply)&lt;/p&gt;

&lt;p&gt;res.send() → sends plain text or HTML as response.&lt;/p&gt;

&lt;p&gt;🔹 5. Sending JSON Responses&lt;br&gt;
app.get("/api/info", (req, res) =&amp;gt; {&lt;br&gt;
  res.json({&lt;br&gt;
    app: "Express Basics API",&lt;br&gt;
    version: "1.0.0",&lt;br&gt;
    author: "Ankit Silwal",&lt;br&gt;
    time: new Date().toISOString()&lt;br&gt;
  });&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🧩 Explanation:&lt;/p&gt;

&lt;p&gt;res.json() → sends back JSON data.&lt;br&gt;
Express automatically sets the Content-Type: application/json header.&lt;/p&gt;

&lt;p&gt;In real APIs, this is how servers return data (like user info, products, etc.).&lt;/p&gt;

&lt;p&gt;🔹 6. Starting the Server (app.listen)&lt;br&gt;
app.listen(PORT, () =&amp;gt; {&lt;br&gt;
  console.log(&lt;code&gt;✅ Server started on http://localhost:${PORT}&lt;/code&gt;);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🧩 Explanation:&lt;/p&gt;

&lt;p&gt;app.listen() → tells the server to start listening for requests on the given port.&lt;/p&gt;

&lt;p&gt;When someone visits &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;, the server will respond using the routes you defined.&lt;/p&gt;

&lt;p&gt;The callback function runs once the server starts — it’s used just for logging.&lt;/p&gt;

&lt;p&gt;✅ Your Full Code:&lt;br&gt;
import express from "express";&lt;/p&gt;

&lt;p&gt;const app = express();&lt;br&gt;
const PORT = process.env.PORT || 3000;&lt;/p&gt;

&lt;p&gt;app.get("/", (req, res) =&amp;gt; {&lt;br&gt;
  res.send("🚀 Server is running...");&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;app.get("/api/info", (req, res) =&amp;gt; {&lt;br&gt;
  res.json({&lt;br&gt;
    app: "Express Basics API",&lt;br&gt;
    version: "1.0.0",&lt;br&gt;
    author: "Ankit Silwal",&lt;br&gt;
    time: new Date().toISOString()&lt;br&gt;
  });&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;app.listen(PORT, () =&amp;gt; {&lt;br&gt;
  console.log(&lt;code&gt;✅ Server started on http://localhost:${PORT}&lt;/code&gt;);&lt;br&gt;
});&lt;/p&gt;

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

&lt;p&gt;npm run start:dev&lt;/p&gt;

&lt;p&gt;Then open:&lt;br&gt;
👉 &lt;a href="http://localhost:3000/" rel="noopener noreferrer"&gt;http://localhost:3000/&lt;/a&gt; → see text&lt;br&gt;
👉 &lt;a href="http://localhost:3000/api/info" rel="noopener noreferrer"&gt;http://localhost:3000/api/info&lt;/a&gt; → see JSON&lt;/p&gt;

&lt;p&gt;🧪 Step 9: Understanding How It All Connects&lt;/p&gt;

&lt;p&gt;Here’s how your code works in flow:&lt;/p&gt;

&lt;p&gt;Browser sends request to &lt;a href="http://localhost:3000/api/info" rel="noopener noreferrer"&gt;http://localhost:3000/api/info&lt;/a&gt;&lt;br&gt;
        ↓&lt;br&gt;
Express (app) checks if a route matches (/api/info)&lt;br&gt;
        ↓&lt;br&gt;
Your route handler runs (req, res)&lt;br&gt;
        ↓&lt;br&gt;
You send back JSON using res.json()&lt;br&gt;
        ↓&lt;br&gt;
Browser displays the response&lt;/p&gt;

&lt;p&gt;That’s the heart of every web API.&lt;/p&gt;

&lt;p&gt;✅ Phase 1 To-Do List&lt;/p&gt;

&lt;p&gt;Now that you understand all concepts, here’s your Phase 1 Project Checklist:&lt;/p&gt;

&lt;p&gt;🧩 Setup:&lt;/p&gt;

&lt;p&gt;Initialize project with npm init -y&lt;/p&gt;

&lt;p&gt;Install express and nodemon&lt;/p&gt;

&lt;p&gt;Add "type": "module" to package.json&lt;/p&gt;

&lt;p&gt;Add "start" and "start:dev" scripts&lt;/p&gt;

&lt;p&gt;⚙️ Code:&lt;/p&gt;

&lt;p&gt;Import Express (import express from "express")&lt;/p&gt;

&lt;p&gt;Create app using express()&lt;/p&gt;

&lt;p&gt;Define PORT variable (default 3000)&lt;/p&gt;

&lt;p&gt;Create two routes:&lt;/p&gt;

&lt;p&gt;/ → return a text message&lt;/p&gt;

&lt;p&gt;/api/info → return JSON info&lt;/p&gt;

&lt;p&gt;Start server with app.listen(PORT)&lt;/p&gt;

&lt;p&gt;🔧 Improvements (Mini Challenges):&lt;/p&gt;

&lt;p&gt;Add /health route returning:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "status": "OK",&lt;br&gt;
  "uptime": "1234 seconds",&lt;br&gt;
  "timestamp": "2025-11-11T10:00:00Z"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Use environment variables (dotenv)&lt;/p&gt;

&lt;p&gt;Create a separate file for routes later (optional)&lt;/p&gt;

&lt;p&gt;🎯 Goal by end of Phase 1:&lt;br&gt;
You should be able to explain these terms clearly:&lt;/p&gt;

&lt;p&gt;Node.js&lt;/p&gt;

&lt;p&gt;Express.js&lt;/p&gt;

&lt;p&gt;app.get()&lt;/p&gt;

&lt;p&gt;req and res&lt;/p&gt;

&lt;p&gt;res.send() vs res.json()&lt;/p&gt;

&lt;p&gt;app.listen()&lt;/p&gt;

&lt;p&gt;What is a port and how the server listens&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import express from 'express';
import dotenv from 'dotenv';
dotenv.config();

const app=express();
const PORT=process.env.PORT;
app.get("/",(req,res)=&amp;gt;{
  res.send("This is just a project for me")
})
app.get("/api/info",(req,res)=&amp;gt;{
  res.json({
    author:"Ankit",
    project:"Anonymous even for me",
    platformused:"ChatGPT"
  })
})
app.get("/api/health",(req,res)=&amp;gt;{
  res.json({
    status:"ok",
    runtime:"from 6:22"
  })
})
app.listen(PORT,()=&amp;gt;{
  console.log(`The server has begun at the port number ${PORT}`);
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Phase 2
&lt;/h4&gt;

&lt;p&gt;🧱 Phase 2: Basic Routing and Data Retrieval (GET)&lt;/p&gt;

&lt;p&gt;🎯 Goal for This Phase&lt;br&gt;
By the end of this phase, you’ll be able to:&lt;/p&gt;

&lt;p&gt;Define multiple GET routes for different resources.&lt;/p&gt;

&lt;p&gt;Use route parameters (/api/users/:id) to get specific items.&lt;/p&gt;

&lt;p&gt;Use query strings (/api/users?filter=name&amp;amp;value=ankit) to filter results.&lt;/p&gt;

&lt;p&gt;Send responses in both plain text and JSON format.&lt;/p&gt;

&lt;p&gt;Understand and properly set HTTP status codes (200, 400, 404).&lt;/p&gt;

&lt;p&gt;🧠 Step 1: Understanding the GET Method&lt;br&gt;
💬 What is GET?&lt;br&gt;
GET is an HTTP method used to retrieve data from the server.&lt;br&gt;
It’s the most common and simplest type of request.&lt;br&gt;
When you type a URL in your browser (like &lt;a href="https://github.com" rel="noopener noreferrer"&gt;https://github.com&lt;/a&gt;),&lt;br&gt;
you’re sending a GET request.&lt;br&gt;
⚙️ In Express:&lt;br&gt;
app.get("/api/users", (req, res) =&amp;gt; {&lt;br&gt;
  res.send("List of users");&lt;br&gt;
});&lt;/p&gt;

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

&lt;p&gt;When a client makes a GET request to /api/users,&lt;br&gt;
respond with “List of users.”&lt;/p&gt;

&lt;p&gt;🧩 Step 2: Create Mock Data&lt;br&gt;
Let’s simulate a database using an array (since we don’t have a DB yet):&lt;br&gt;
const users = [&lt;br&gt;
  { id: 1, name: "Ankit", age: 20, city: "Kathmandu" },&lt;br&gt;
  { id: 2, name: "Ravi", age: 22, city: "Delhi" },&lt;br&gt;
  { id: 3, name: "Priya", age: 19, city: "Mumbai" },&lt;br&gt;
  { id: 4, name: "Rahul", age: 23, city: "Bangalore" }&lt;br&gt;
];&lt;/p&gt;

&lt;p&gt;⚙️ Step 3: Define a Base Route&lt;br&gt;
The root route is just to confirm your server works.&lt;br&gt;
app.get("/", (req, res) =&amp;gt; {&lt;br&gt;
  res.send("🚀 Express API is running successfully!");&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;⚙️ Step 4: Create a Route to Get All Users&lt;br&gt;
This returns all users in your mock array.&lt;br&gt;
app.get("/api/users", (req, res) =&amp;gt; {&lt;br&gt;
  res.status(200).json(users);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🧩 Explanation:&lt;/p&gt;

&lt;p&gt;res.status(200) → 200 = OK (successful request)&lt;/p&gt;

&lt;p&gt;.json(users) → sends data as JSON&lt;/p&gt;

&lt;p&gt;Now if you visit&lt;br&gt;
&lt;a href="http://localhost:3000/api/users" rel="noopener noreferrer"&gt;http://localhost:3000/api/users&lt;/a&gt;&lt;br&gt;
you’ll get the entire array.&lt;/p&gt;

&lt;p&gt;⚙️ Step 5: Dynamic Routing Using Route Parameters (req.params)&lt;br&gt;
This allows you to get a specific user by ID, using the concept we discussed earlier.&lt;br&gt;
app.get("/api/users/:id", (req, res) =&amp;gt; {&lt;br&gt;
  const id = parseInt(req.params.id); // Get the ID from the URL&lt;br&gt;
  if (isNaN(id)) {&lt;br&gt;
    return res.status(400).json({ error: "Invalid ID format" });&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;const user = users.find(u =&amp;gt; u.id === id);&lt;/p&gt;

&lt;p&gt;if (!user) {&lt;br&gt;
    return res.status(404).json({ error: "User not found" });&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;res.json(user);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🧠 What happens:&lt;/p&gt;

&lt;p&gt;When you go to /api/users/2&lt;br&gt;
→ Express matches :id → extracts 2&lt;br&gt;
→ Finds the user with id: 2&lt;br&gt;
→ Returns it as JSON&lt;/p&gt;

&lt;p&gt;⚙️ Step 6: Using Query Strings for Filtering (req.query)&lt;br&gt;
Now suppose you want to filter users by their name or city:&lt;br&gt;
/api/users?filter=city&amp;amp;value=Delhi&lt;/p&gt;

&lt;p&gt;Code:&lt;br&gt;
app.get("/api/users", (req, res) =&amp;gt; {&lt;br&gt;
  const { filter, value } = req.query;&lt;/p&gt;

&lt;p&gt;if (filter &amp;amp;&amp;amp; value) {&lt;br&gt;
    const filteredUsers = users.filter(user =&amp;gt; {&lt;br&gt;
      return user[filter]?.toString().toLowerCase().includes(value.toLowerCase());&lt;br&gt;
    });&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (filteredUsers.length === 0) {
  return res.status(404).json({ error: "No users match the filter criteria" });
}

return res.json(filteredUsers);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;res.json(users);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🧩 Explanation:&lt;/p&gt;

&lt;p&gt;req.query → captures query string values from the URL.&lt;/p&gt;

&lt;p&gt;For /api/users?filter=city&amp;amp;value=Delhi:&lt;/p&gt;

&lt;p&gt;req.query.filter → "city"&lt;/p&gt;

&lt;p&gt;req.query.value → "Delhi"&lt;/p&gt;

&lt;p&gt;If no filter is provided, it just returns all users.&lt;/p&gt;

&lt;p&gt;⚙️ Step 7: Send Proper HTTP Status Codes&lt;br&gt;
Common status codes to use:&lt;br&gt;
CodeMeaningWhen to Use200OKSuccessful request201CreatedWhen something new is created (used later)400Bad RequestWhen user input is invalid404Not FoundResource doesn’t exist500Server ErrorSomething went wrong on the backend&lt;br&gt;
In this phase, you’ll mostly use 200, 400, and 404.&lt;/p&gt;

&lt;p&gt;💻 Full Example Code for Phase 2&lt;br&gt;
Here’s how your file might look by now:&lt;br&gt;
import express from "express";&lt;br&gt;
import dotenv from "dotenv";&lt;/p&gt;

&lt;p&gt;dotenv.config();&lt;br&gt;
const app = express();&lt;br&gt;
const PORT = process.env.PORT || 3000;&lt;/p&gt;

&lt;p&gt;const users = [&lt;br&gt;
  { id: 1, name: "Ankit", age: 20, city: "Kathmandu" },&lt;br&gt;
  { id: 2, name: "Ravi", age: 22, city: "Delhi" },&lt;br&gt;
  { id: 3, name: "Priya", age: 19, city: "Mumbai" },&lt;br&gt;
  { id: 4, name: "Rahul", age: 23, city: "Bangalore" }&lt;br&gt;
];&lt;/p&gt;

&lt;p&gt;// Base route&lt;br&gt;
app.get("/", (req, res) =&amp;gt; {&lt;br&gt;
  res.send("🚀 Express API is running successfully!");&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// Get all users or filtered users&lt;br&gt;
app.get("/api/users", (req, res) =&amp;gt; {&lt;br&gt;
  const { filter, value } = req.query;&lt;/p&gt;

&lt;p&gt;if (filter &amp;amp;&amp;amp; value) {&lt;br&gt;
    const filteredUsers = users.filter(user =&amp;gt;&lt;br&gt;
      user[filter]?.toString().toLowerCase().includes(value.toLowerCase())&lt;br&gt;
    );&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (filteredUsers.length === 0) {
  return res.status(404).json({ error: "No users found" });
}

return res.status(200).json(filteredUsers);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;res.status(200).json(users);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// Get a specific user by ID&lt;br&gt;
app.get("/api/users/:id", (req, res) =&amp;gt; {&lt;br&gt;
  const id = parseInt(req.params.id);&lt;/p&gt;

&lt;p&gt;if (isNaN(id)) {&lt;br&gt;
    return res.status(400).json({ error: "Invalid ID format" });&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;const user = users.find(u =&amp;gt; u.id === id);&lt;/p&gt;

&lt;p&gt;if (!user) {&lt;br&gt;
    return res.status(404).json({ error: "User not found" });&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;res.status(200).json(user);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;app.listen(PORT, () =&amp;gt; {&lt;br&gt;
  console.log(&lt;code&gt;✅ Server running at http://localhost:${PORT}&lt;/code&gt;);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🔧 Phase 2 To-Do List (Practice Tasks)&lt;br&gt;
🧩 Setup:&lt;/p&gt;

&lt;p&gt;Add a mock array of users to your app.&lt;/p&gt;

&lt;p&gt;Define a route /api/users that returns all users.&lt;/p&gt;

&lt;p&gt;Define a route /api/users/:id that returns a specific user by ID.&lt;/p&gt;

&lt;p&gt;Handle invalid/nonexistent IDs with proper HTTP status codes.&lt;/p&gt;

&lt;p&gt;Add filtering logic with query strings:&lt;/p&gt;

&lt;p&gt;/api/users?filter=city&amp;amp;value=Delhi&lt;/p&gt;

&lt;p&gt;/api/users?filter=name&amp;amp;value=ankit&lt;/p&gt;

&lt;p&gt;💡 Improvement Tasks:&lt;/p&gt;

&lt;p&gt;Add a /api/products route with its own array and parameters.&lt;/p&gt;

&lt;p&gt;Write a helper function validateId(id) that checks if ID is valid.&lt;/p&gt;

&lt;p&gt;Add custom error messages with status and message fields.&lt;/p&gt;

&lt;p&gt;Try combining query + parameter (e.g., /api/users/:id?detail=full).&lt;/p&gt;

&lt;p&gt;✅ Learning Outcome&lt;br&gt;
After finishing Phase 2, you will clearly understand:&lt;/p&gt;

&lt;p&gt;How GET requests work.&lt;/p&gt;

&lt;p&gt;The difference between static routes, route parameters, and query strings.&lt;/p&gt;

&lt;p&gt;How Express handles URL data using req.params and req.query.&lt;/p&gt;

&lt;p&gt;How to send dynamic responses and handle errors gracefully.&lt;/p&gt;

&lt;p&gt;Next, we’ll move to Phase 3: Creating and Modifying Data (POST, PUT, PATCH, DELETE) — that’s when you’ll learn how APIs actually accept and modify data, making your server truly dynamic.&lt;br&gt;
Would you like me to start Phase 3: CRUD Operations (POST, PUT, PATCH, DELETE) next?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import express from 'express';
import dotenv from 'dotenv';
dotenv.config();
const users=[{
    id:1,
    name:"Ankit",
    systemid:"2024900700",
    course:"Btech"
  },{
    id:2,
    name:"Nandalal",
    systemid:"202489484",
    course:"Engineering"
  },{
    id:3,
    name:"Anish",
    systemid:"2024948554",
    course:"Bpharma"
  }]
const app=express();
const PORT=process.env.PORT;
app.get("/",(req,res)=&amp;gt;{
  res.send("Just gettng the required data")
})
app.get("/api/users", (req, res) =&amp;gt; {
  const { filter, value } = req.query;
  if (filter &amp;amp;&amp;amp; value) {
    const filteredUsers = users.filter(user =&amp;gt; {
      return user[filter]?.toString().toLowerCase().includes(value.toLowerCase());
    });
    if (filteredUsers.length === 0) {
      return res.status(404).json({ error: "No users match the filter criteria" });
    }
    return res.json(filteredUsers);
  }
  res.json(users);
});
app.get('/api/users/:id',(req,res)=&amp;gt;{
  const query=req.query;
  const id=parseInt(req.params.id);
  const user=users.find(usr=&amp;gt;usr.id===id);
  if(!user){
    res.send("The user wasnt found!")
  }
  if(!query.details){
    res.json(user)  
  }
  if(query.details=="name"){
    res.send(user.name);
  }
  if(query.details=="systemid"){
    res.send(user.systemid);
  }
  res.json(user);
})
app.get("/api/health",(req,res)=&amp;gt;{
  res.json({
    status:"ok",
    runtime:"from 6:22"
  })
})
app.listen(PORT,()=&amp;gt;{
  console.log(`The server has begun at the port number ${PORT}`);
}) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Phase 3
&lt;/h4&gt;

&lt;p&gt;🧱 Phase 3: Creating and Modifying Data (POST, PUT, PATCH, DELETE)&lt;br&gt;
🎯 Goal of This Phase&lt;/p&gt;

&lt;p&gt;By the end, you’ll be able to:&lt;/p&gt;

&lt;p&gt;Create new data using POST requests.&lt;/p&gt;

&lt;p&gt;Update existing data using PUT and PATCH.&lt;/p&gt;

&lt;p&gt;Delete data using DELETE.&lt;/p&gt;

&lt;p&gt;Parse incoming JSON request bodies using Express middleware.&lt;/p&gt;

&lt;p&gt;Understand and apply proper HTTP status codes for each operation.&lt;/p&gt;

&lt;p&gt;🧠 Step 1: What is CRUD?&lt;/p&gt;

&lt;p&gt;CRUD = Create, Read, Update, Delete&lt;br&gt;
It’s the core of every backend system.&lt;/p&gt;

&lt;p&gt;Operation   HTTP Method Description Example&lt;br&gt;
Create  POST    Add new data    /api/users&lt;br&gt;
Read    GET Fetch data  /api/users or /api/users/:id&lt;br&gt;
Update  PUT or PATCH    Modify existing data    /api/users/:id&lt;br&gt;
Delete  DELETE  Remove data /api/users/:id&lt;/p&gt;

&lt;p&gt;You already covered “R” in CRUD during Phase 2.&lt;br&gt;
Now, let’s learn C, U, and D.&lt;/p&gt;

&lt;p&gt;🧩 Step 2: Setting up JSON Middleware&lt;/p&gt;

&lt;p&gt;When clients send data to the backend (like forms or JSON payloads),&lt;br&gt;
Express doesn’t automatically parse that data.&lt;/p&gt;

&lt;p&gt;We need to enable JSON parsing middleware:&lt;/p&gt;

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

&lt;p&gt;💡 Explanation:&lt;/p&gt;

&lt;p&gt;This built-in middleware lets Express read JSON request bodies (like when a frontend sends data via POST).&lt;/p&gt;

&lt;p&gt;Add this line before your routes in your code:&lt;/p&gt;

&lt;p&gt;const app = express();&lt;br&gt;
app.use(express.json());&lt;/p&gt;

&lt;p&gt;⚙️ Step 3: The POST Request — Creating Data&lt;/p&gt;

&lt;p&gt;Let’s start by allowing users to add a new user.&lt;/p&gt;

&lt;p&gt;Code:&lt;br&gt;
app.post("/api/users", (req, res) =&amp;gt; {&lt;br&gt;
  const newUser = req.body;&lt;/p&gt;

&lt;p&gt;// Validation: ensure required fields exist&lt;br&gt;
  if (!newUser.name || !newUser.age || !newUser.city) {&lt;br&gt;
    return res.status(400).json({ error: "Missing required fields" });&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;// Generate a new ID (auto-increment style)&lt;br&gt;
  newUser.id = users.length ? users[users.length - 1].id + 1 : 1;&lt;/p&gt;

&lt;p&gt;users.push(newUser);&lt;/p&gt;

&lt;p&gt;res.status(201).json({&lt;br&gt;
    message: "User created successfully",&lt;br&gt;
    data: newUser&lt;br&gt;
  });&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🧠 Explanation:&lt;/p&gt;

&lt;p&gt;req.body contains the data the client sends.&lt;/p&gt;

&lt;p&gt;res.status(201) = “Created” — the standard success code for new resources.&lt;/p&gt;

&lt;p&gt;We push the new object into the users array.&lt;/p&gt;

&lt;p&gt;Example POST body (in Thunder Client or Postman):&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "name": "Sita",&lt;br&gt;
  "age": 21,&lt;br&gt;
  "city": "Kolkata"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Response:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "message": "User created successfully",&lt;br&gt;
  "data": {&lt;br&gt;
    "id": 5,&lt;br&gt;
    "name": "Sita",&lt;br&gt;
    "age": 21,&lt;br&gt;
    "city": "Kolkata"&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;⚙️ Step 4: The PUT Request — Full Update&lt;br&gt;
Concept:&lt;/p&gt;

&lt;p&gt;PUT completely replaces the existing data.&lt;/p&gt;

&lt;p&gt;If any field is missing, it’s treated as removed.&lt;/p&gt;

&lt;p&gt;Code:&lt;br&gt;
app.put("/api/users/:id", (req, res) =&amp;gt; {&lt;br&gt;
  const id = parseInt(req.params.id);&lt;br&gt;
  const updatedUser = req.body;&lt;/p&gt;

&lt;p&gt;if (isNaN(id)) return res.status(400).json({ error: "Invalid ID format" });&lt;/p&gt;

&lt;p&gt;const index = users.findIndex(u =&amp;gt; u.id === id);&lt;br&gt;
  if (index === -1) return res.status(404).json({ error: "User not found" });&lt;/p&gt;

&lt;p&gt;// Replace entire object (old method)&lt;br&gt;
  users[index] = { id, ...updatedUser };&lt;/p&gt;

&lt;p&gt;res.status(200).json({&lt;br&gt;
    message: "User replaced successfully",&lt;br&gt;
    data: users[index]&lt;br&gt;
  });&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🧠 Example:&lt;br&gt;
Request → PUT /api/users/2&lt;br&gt;
Body:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "name": "Ravi Updated",&lt;br&gt;
  "age": 23,&lt;br&gt;
  "city": "Pune"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Response:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "message": "User replaced successfully",&lt;br&gt;
  "data": { "id": 2, "name": "Ravi Updated", "age": 23, "city": "Pune" }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;If you omit any property, the old one is erased, not kept.&lt;/p&gt;

&lt;p&gt;⚙️ Step 5: The PATCH Request — Partial Update&lt;br&gt;
Concept:&lt;/p&gt;

&lt;p&gt;PATCH modifies only specific fields.&lt;/p&gt;

&lt;p&gt;It merges the new data with the old one.&lt;/p&gt;

&lt;p&gt;Code:&lt;br&gt;
app.patch("/api/users/:id", (req, res) =&amp;gt; {&lt;br&gt;
  const id = parseInt(req.params.id);&lt;br&gt;
  const partialUpdate = req.body;&lt;/p&gt;

&lt;p&gt;if (isNaN(id)) return res.status(400).json({ error: "Invalid ID format" });&lt;/p&gt;

&lt;p&gt;const user = users.find(u =&amp;gt; u.id === id);&lt;br&gt;
  if (!user) return res.status(404).json({ error: "User not found" });&lt;/p&gt;

&lt;p&gt;// Merge old and new data&lt;br&gt;
  Object.assign(user, partialUpdate);&lt;/p&gt;

&lt;p&gt;res.status(200).json({&lt;br&gt;
    message: "User updated successfully",&lt;br&gt;
    data: user&lt;br&gt;
  });&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🧠 Example:&lt;br&gt;
Request → PATCH /api/users/2&lt;br&gt;
Body:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "city": "Lucknow"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Response:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "message": "User updated successfully",&lt;br&gt;
  "data": { "id": 2, "name": "Ravi Updated", "age": 23, "city": "Lucknow" }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;⚙️ Step 6: The DELETE Request — Removing Data&lt;br&gt;
Code:&lt;br&gt;
app.delete("/api/users/:id", (req, res) =&amp;gt; {&lt;br&gt;
  const id = parseInt(req.params.id);&lt;br&gt;
  if (isNaN(id)) return res.status(400).json({ error: "Invalid ID format" });&lt;/p&gt;

&lt;p&gt;const index = users.findIndex(u =&amp;gt; u.id === id);&lt;br&gt;
  if (index === -1) return res.status(404).json({ error: "User not found" });&lt;/p&gt;

&lt;p&gt;users.splice(index, 1);&lt;/p&gt;

&lt;p&gt;res.status(204).send(); // 204 = No Content (successful deletion)&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🧠 Explanation:&lt;/p&gt;

&lt;p&gt;splice(index, 1) removes the user.&lt;/p&gt;

&lt;p&gt;204 status means the request succeeded but there’s no content to return.&lt;/p&gt;

&lt;p&gt;⚙️ Step 7: Test Your API&lt;/p&gt;

&lt;p&gt;Use Thunder Client (or Postman) and test each route:&lt;/p&gt;

&lt;p&gt;Operation   Method  Route   Example Body&lt;br&gt;
Create  POST    /api/users  { "name": "Sita", "age": 21, "city": "Kolkata" }&lt;br&gt;
Read All    GET /api/users  —&lt;br&gt;
Read One    GET /api/users/2    —&lt;br&gt;
Update Full PUT /api/users/2    { "name": "Ravi Updated", "age": 23, "city": "Pune" }&lt;br&gt;
Update Partial  PATCH   /api/users/2    { "city": "Lucknow" }&lt;br&gt;
Delete  DELETE  /api/users/2    —&lt;br&gt;
🧾 Full Example File (Phase 3 Ready)&lt;br&gt;
import express from "express";&lt;br&gt;
import dotenv from "dotenv";&lt;/p&gt;

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

&lt;p&gt;const app = express();&lt;br&gt;
const PORT = process.env.PORT || 3000;&lt;/p&gt;

&lt;p&gt;app.use(express.json()); // Middleware for parsing JSON bodies&lt;/p&gt;

&lt;p&gt;const users = [&lt;br&gt;
  { id: 1, name: "Ankit", age: 20, city: "Kathmandu" },&lt;br&gt;
  { id: 2, name: "Ravi", age: 22, city: "Delhi" },&lt;br&gt;
  { id: 3, name: "Priya", age: 19, city: "Mumbai" },&lt;br&gt;
  { id: 4, name: "Rahul", age: 23, city: "Bangalore" }&lt;br&gt;
];&lt;/p&gt;

&lt;p&gt;// CREATE (POST)&lt;br&gt;
app.post("/api/users", (req, res) =&amp;gt; {&lt;br&gt;
  const newUser = req.body;&lt;br&gt;
  if (!newUser.name || !newUser.age || !newUser.city)&lt;br&gt;
    return res.status(400).json({ error: "Missing required fields" });&lt;/p&gt;

&lt;p&gt;newUser.id = users.length ? users[users.length - 1].id + 1 : 1;&lt;br&gt;
  users.push(newUser);&lt;br&gt;
  res.status(201).json({ message: "User created", data: newUser });&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// READ (GET)&lt;br&gt;
app.get("/api/users", (req, res) =&amp;gt; res.json(users));&lt;/p&gt;

&lt;p&gt;// READ (GET by ID)&lt;br&gt;
app.get("/api/users/:id", (req, res) =&amp;gt; {&lt;br&gt;
  const id = parseInt(req.params.id);&lt;br&gt;
  const user = users.find(u =&amp;gt; u.id === id);&lt;br&gt;
  if (!user) return res.status(404).json({ error: "User not found" });&lt;br&gt;
  res.json(user);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// UPDATE (PUT)&lt;br&gt;
app.put("/api/users/:id", (req, res) =&amp;gt; {&lt;br&gt;
  const id = parseInt(req.params.id);&lt;br&gt;
  const index = users.findIndex(u =&amp;gt; u.id === id);&lt;br&gt;
  if (index === -1) return res.status(404).json({ error: "User not found" });&lt;br&gt;
  users[index] = { id, ...req.body };&lt;br&gt;
  res.json({ message: "User replaced", data: users[index] });&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// PARTIAL UPDATE (PATCH)&lt;br&gt;
app.patch("/api/users/:id", (req, res) =&amp;gt; {&lt;br&gt;
  const id = parseInt(req.params.id);&lt;br&gt;
  const user = users.find(u =&amp;gt; u.id === id);&lt;br&gt;
  if (!user) return res.status(404).json({ error: "User not found" });&lt;br&gt;
  Object.assign(user, req.body);&lt;br&gt;
  res.json({ message: "User updated", data: user });&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// DELETE&lt;br&gt;
app.delete("/api/users/:id", (req, res) =&amp;gt; {&lt;br&gt;
  const id = parseInt(req.params.id);&lt;br&gt;
  const index = users.findIndex(u =&amp;gt; u.id === id);&lt;br&gt;
  if (index === -1) return res.status(404).json({ error: "User not found" });&lt;br&gt;
  users.splice(index, 1);&lt;br&gt;
  res.status(204).send();&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;app.listen(PORT, () =&amp;gt; {&lt;br&gt;
  console.log(&lt;code&gt;✅ Server running on http://localhost:${PORT}&lt;/code&gt;);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🧩 Phase 3 To-Do Checklist&lt;br&gt;
Setup:&lt;/p&gt;

&lt;p&gt;Add app.use(express.json()).&lt;/p&gt;

&lt;p&gt;Implement routes:&lt;/p&gt;

&lt;p&gt;POST /api/users → create new user.&lt;/p&gt;

&lt;p&gt;PUT /api/users/:id → replace full user.&lt;/p&gt;

&lt;p&gt;PATCH /api/users/:id → modify part of a user.&lt;/p&gt;

&lt;p&gt;DELETE /api/users/:id → remove user.&lt;/p&gt;

&lt;p&gt;Validate inputs and handle 404, 400 properly.&lt;/p&gt;

&lt;p&gt;Improvements:&lt;/p&gt;

&lt;p&gt;Create helper function findUserIndex(id).&lt;/p&gt;

&lt;p&gt;Return success/failure messages consistently.&lt;/p&gt;

&lt;p&gt;Add a check to prevent duplicate names (just for practice).&lt;/p&gt;

&lt;p&gt;Separate routes into another file later (to prepare for Phase 5).&lt;/p&gt;

&lt;p&gt;🎯 Learning Outcome&lt;/p&gt;

&lt;p&gt;By finishing this phase, you’ll:&lt;/p&gt;

&lt;p&gt;Understand how data flows from client → server → memory.&lt;/p&gt;

&lt;p&gt;Know the difference between PUT and PATCH.&lt;/p&gt;

&lt;p&gt;Master using Express middleware for parsing data.&lt;/p&gt;

&lt;p&gt;Be comfortable handling all four CRUD operations.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>node</category>
      <category>backend</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
