Week 7 Day 5 challenges— Serving Static Files + fs module.
🔧 Challenge 1 — Make Your Own Mini Website With Express
Goal: Serve a small multi-page static website
Requirements:
Create a public/ folder with:
➙index.html
➙about.html
➙contact.html
➙A CSS file (styles.css)
Use express.static() to serve everything.
Add links between pages.
In index.html include a simple JavaScript file (main.js) that logs something to console.
What you must learn while solving:
➤How a server serves HTML/CSS/JS
➤Folder structure matters
➤Paths inside HTML (href, src)
➤That Express does NOT “touch” your HTML; it simply delivers files
📘 Challenge 2 — Build a “Notes API” with File Storage
Goal: Build an API that saves notes in a JSON file.
Requirements:
➙Create data/notes.json
➙Use fs.readFileSync and fs.writeFileSync
API Endpoints:
➙GET /notes → return all notes
➙POST /notes → add a new note Body contains { "title": "...", "content": "..." }
➙DELETE /notes/:id → delete a note by id
On server start:
➙If file does NOT exist, create it with [].
What you must learn:
➤How to read/write JSON files
➤How Express handles JSON bodies
➤How frontend (or Postman) interacts with an API
➤Error handling when reading broken JSON
📸 Challenge 3 — Create an Image Gallery (Static + Dynamic API)
Goal: Mix both static files AND APIs
Requirements:
➙Use a public/gallery/ folder that contains several images.
➙Serve them using express.static().
Make an API:
➙GET /api/images
→ return an array of image file names found in /public/gallery/
(Use fs.readdirSync to list files).
➙Create a frontend page (gallery.html) that:
➙Fetches /api/images
➙Displays all images dynamically using JavaScript
What you learn here:
➤How Express serves static assets
➤How to dynamically list files with fs
➤How frontend uses fetch() to get data from backend
➤Combining static HTML with dynamic API data
💥share your solutions in the group,
💥invite a friend,
and as always —
💥stay well, stay curious, and stay coding ✌️
🔧 Challenge 1 — Make Your Own Mini Website With Express
Goal: Serve a small multi-page static website
Requirements:
Create a public/ folder with:
➙index.html
➙about.html
➙contact.html
➙A CSS file (styles.css)
Use express.static() to serve everything.
Add links between pages.
In index.html include a simple JavaScript file (main.js) that logs something to console.
What you must learn while solving:
➤How a server serves HTML/CSS/JS
➤Folder structure matters
➤Paths inside HTML (href, src)
➤That Express does NOT “touch” your HTML; it simply delivers files
📘 Challenge 2 — Build a “Notes API” with File Storage
Goal: Build an API that saves notes in a JSON file.
Requirements:
➙Create data/notes.json
➙Use fs.readFileSync and fs.writeFileSync
API Endpoints:
➙GET /notes → return all notes
➙POST /notes → add a new note Body contains { "title": "...", "content": "..." }
➙DELETE /notes/:id → delete a note by id
On server start:
➙If file does NOT exist, create it with [].
What you must learn:
➤How to read/write JSON files
➤How Express handles JSON bodies
➤How frontend (or Postman) interacts with an API
➤Error handling when reading broken JSON
📸 Challenge 3 — Create an Image Gallery (Static + Dynamic API)
Goal: Mix both static files AND APIs
Requirements:
➙Use a public/gallery/ folder that contains several images.
➙Serve them using express.static().
Make an API:
➙GET /api/images
→ return an array of image file names found in /public/gallery/
(Use fs.readdirSync to list files).
➙Create a frontend page (gallery.html) that:
➙Fetches /api/images
➙Displays all images dynamically using JavaScript
What you learn here:
➤How Express serves static assets
➤How to dynamically list files with fs
➤How frontend uses fetch() to get data from backend
➤Combining static HTML with dynamic API data
💥share your solutions in the group,
💥invite a friend,
and as always —
💥stay well, stay curious, and stay coding ✌️
Week 7 Day 6: ⭐ Error Handling in Express
and
⭐ Environment Variables & Configurations
🌞 Good Afternoon Devs
Today we enter a very important part of backend development:
These two topics make your apps safe, predictable, and professional.
Without them, everything becomes chaos — like a city with no emergency system and no addresses.
Let’s start!
🚑 PART 1 — Error Handling in Express
When you build a server, errors WILL happen. Not maybe — absolutely, definitely, surely.
Your API might crash because:
➤File not found
➤JSON is broken
➤Database down
➤User sent invalid data
➤Logic error in your code
But Express gives us a structured way of dealing with errors.
🧨 1. What is an Error in Express?
Think of your Express app like a restaurant kitchen.
➙If everything is fine → Meals go out
➙If something burns, falls, spills → Errors happen
Errors must be:
➣Detected (you notice something is wrong)
➣Passed to the right handler
➣Handled cleanly (customer gets a nice explanation, not a disaster)
In code, this is the same:
🧩 2. Common Error Types
🔴 Type 1 — Syntax Errors
Mistakes in code.
🟡 Type 2 — Runtime Errors
Something wrong during execution.
🔵 Type 3 — HTTP Errors
User sends wrong data:
➤Missing ID
➤Invalid query
➤Empty body
➤Unauthorized request
🟠 Type 4 — File System / Database Errors
Example:
File does not exist → Crash if unhandled.
🛠️ 3. How Express Normally Handles Errors
If you throw an error inside a route:
Express will crash your server unless you have special error middleware.
📣 4. Using next(err) to Pass Errors
This is like calling the restaurant manager when something goes wrong.
Calling next(err) tells Express:
🧯 5. Custom Error-Handling Middleware
This is the firefighter of your app.
🧠 Rule:
An error handler MUST have 4 arguments:
Why?
Express identifies error-handlers by (err, req, res, next) shape.
⚠️ 6. Sending Clean Error Responses
Instead of giving users ugly, confusing errors…
Bad response:
Good response:
This makes your API professional.
Example:
🧱 7. Common Mistakes
❌ Forgetting return before next(err)
This can cause multiple responses.
❌ Throwing error after sending res.send()
If you already sent a response, stop.
❌ Writing error handler before routes
Order matters in Express!
☑️Error handling helps you:
➤Prevent server crashes
➤Send helpful messages
➤Track issues
➤Debug easily
➤Keep users happy
and
⭐ Environment Variables & Configurations
🌞 Good Afternoon Devs
Today we enter a very important part of backend development:
These two topics make your apps safe, predictable, and professional.
Without them, everything becomes chaos — like a city with no emergency system and no addresses.
Let’s start!
🚑 PART 1 — Error Handling in Express
When you build a server, errors WILL happen. Not maybe — absolutely, definitely, surely.
Your API might crash because:
➤File not found
➤JSON is broken
➤Database down
➤User sent invalid data
➤Logic error in your code
But Express gives us a structured way of dealing with errors.
🧨 1. What is an Error in Express?
Think of your Express app like a restaurant kitchen.
➙If everything is fine → Meals go out
➙If something burns, falls, spills → Errors happen
Errors must be:
➣Detected (you notice something is wrong)
➣Passed to the right handler
➣Handled cleanly (customer gets a nice explanation, not a disaster)
In code, this is the same:
throw new Error("Something went wrong!");
or
next(new Error("File missing!"));
🧩 2. Common Error Types
🔴 Type 1 — Syntax Errors
Mistakes in code.
console.log("Hello" 🟡 Type 2 — Runtime Errors
Something wrong during execution.
JSON.parse("broken json"); 🔵 Type 3 — HTTP Errors
User sends wrong data:
➤Missing ID
➤Invalid query
➤Empty body
➤Unauthorized request
🟠 Type 4 — File System / Database Errors
Example:
fs.readFileSync("./data/missing.json"); File does not exist → Crash if unhandled.
🛠️ 3. How Express Normally Handles Errors
If you throw an error inside a route:
app.get("/test", (req, res) => { throw new Error("Boom!"); }); Express will crash your server unless you have special error middleware.
📣 4. Using next(err) to Pass Errors
This is like calling the restaurant manager when something goes wrong.
app.get("/user", (req, res, next) => { try { let user = JSON.parse("broken-json"); res.send(user); } catch (err) { next(err); // Pass it to error handler } }); Calling next(err) tells Express:
“Hey, something broke. Skip all remaining middlewares and send this error to the official error handler.”
🧯 5. Custom Error-Handling Middleware
This is the firefighter of your app.
🧠 Rule:
An error handler MUST have 4 arguments:
app.use((err, req, res, next) => { console.error(err.stack); res.status(500).json({ success: false, message: err.message, }); }); Why?
Express identifies error-handlers by (err, req, res, next) shape.
⚠️ 6. Sending Clean Error Responses
Instead of giving users ugly, confusing errors…
Bad response:
TypeError: Cannot read properties of undefined Good response:
{ "success": false, "message": "User ID is required." } This makes your API professional.
Example:
app.get("/item/:id", (req, res, next) => {
if (!req.params.id) {
return next(new Error("ID is missing.")); }
res.json({ id: req.params.id }); }); 🧱 7. Common Mistakes
❌ Forgetting return before next(err)
This can cause multiple responses.
❌ Throwing error after sending res.send()
If you already sent a response, stop.
❌ Writing error handler before routes
Order matters in Express!
☑️Error handling helps you:
➤Prevent server crashes
➤Send helpful messages
➤Track issues
➤Debug easily
➤Keep users happy
🌍 PART 2 — Environment Variables & Configurations
Now imagine you have:
A development environment (your laptop)
A production environment (the real server)
They need different settings:
Setting Development Production
port 3000 80
database local cloud
debuglogs ON OFF
API keys fake real
This is why we use environment variables.
🔐 1. What Are Environment Variables?
Think of them like secret notes your app reads.
Example env variables:
➙
We keep them outside the code to protect secrets.
📦 2. Using dotenv in Express
➣Install:
➣Create .env file:
Load dotenv inside server.js:
🧪 3. Why This Is Important
🔒 Security
You never want API keys inside GitHub.
💼 Different Machines = Different Settings
Your code runs everywhere without changes.
🛠️ Configurable Behavior
Turn features ON/OFF easily.
🏭 4. Dev vs Production Configurations
development:
➙console.log allowed
➙local database
➙detailed error messages
production:
➙no console logs
➙cloud database
➙clean error messages
We can do:
🚪 5. Setting Up the Server Port
If .env has PORT=5000, it uses that.
If not, fallback to 3000.
🧭 6. Folder Setup Example
🟥 7. Common Mistakes
❌ Forgetting require("dotenv").config()
Variables will be undefined.
❌ Pushing .env to GitHub
NEVER do this.
❌ Using invalid names
Good:
Bad:
Now imagine you have:
A development environment (your laptop)
A production environment (the real server)
They need different settings:
Setting Development Production
port 3000 80
database local cloud
debuglogs ON OFF
API keys fake real
This is why we use environment variables.
🔐 1. What Are Environment Variables?
Think of them like secret notes your app reads.
Example env variables:
➙
PORT=3000 ➙DB_URL=mongodb://localhost:27017 ➙JWT_SECRET=super_secret_key We keep them outside the code to protect secrets.
📦 2. Using dotenv in Express
➣Install:
npm install dotenv ➣Create .env file:
PORT=4000
MODE=development Load dotenv inside server.js:
require("dotenv").config();
const port = process.env.PORT; console.log("App running on port:", port); 🧪 3. Why This Is Important
🔒 Security
You never want API keys inside GitHub.
💼 Different Machines = Different Settings
Your code runs everywhere without changes.
🛠️ Configurable Behavior
Turn features ON/OFF easily.
🏭 4. Dev vs Production Configurations
development:
➙console.log allowed
➙local database
➙detailed error messages
production:
➙no console logs
➙cloud database
➙clean error messages
We can do:
if (process.env.MODE === "development") { console.log("DEBUG MODE ON"); } 🚪 5. Setting Up the Server Port
const port = process.env.PORT || 3000; app.listen(port, () => { console.log(Server running on port ${port}); });
If .env has PORT=5000, it uses that.
If not, fallback to 3000.
🧭 6. Folder Setup Example
project/
│ server.js
│ .env
│ package.json
└── data/
└── routes/
└── public/ 🟥 7. Common Mistakes
❌ Forgetting require("dotenv").config()
Variables will be undefined.
❌ Pushing .env to GitHub
NEVER do this.
❌ Using invalid names
Good:
API_KEY JWT_SECRET PORT Bad:
my secret keyWeek 7 Day 6 Challenges: (Error Handling + Environment Variables).
✅ Challenge 1 — Build an Error-Safe GET Endpoint
➤Create a route:
Requirements:
➙If id is not a valid number → send an error using next(err)
➙If id is less than 1 → send a custom error "Invalid ID"
➙If everything is valid → return
➤Add a global error-handling middleware to catch all errors
➤The error response must be clean, like:
Hint: Use isNaN(Number(id)) to check validity.
✅ Challenge 2 — Use dotenv to Configure Your App
Steps:
➤Create a .env file containing: ➙
➤Load environment variables using:
➤Start your server using the port from .env
➤Print the mode:
➤Add a rule:
If MODE = "development" → console.log all requests
If MODE = "production" → no logs allowed
Hint: Use app.use() to create a simple logger middleware.
✅ Challenge 3 — Build an API That Reads a File Safely
➤Create a route:
➤Requirements:
Read notes.json using fs
➙If the file is missing → trigger an error using next(err)
➙If JSON is broken → catch the error and forward it to the error handler
➙If everything is fine → return the notes
➤Your global error middleware should send clean output:
Hint: Use:
💥share your solutions in the group,
💥invite a friend,
and as always —
💥stay well, stay curious, and stay coding ✌️
✅ Challenge 1 — Build an Error-Safe GET Endpoint
➤Create a route:
GET /user/:id Requirements:
➙If id is not a valid number → send an error using next(err)
➙If id is less than 1 → send a custom error "Invalid ID"
➙If everything is valid → return
{ "message": "User found", "id": ... } ➤Add a global error-handling middleware to catch all errors
➤The error response must be clean, like:
{ "success": false, "message": "Invalid ID" } Hint: Use isNaN(Number(id)) to check validity.
✅ Challenge 2 — Use dotenv to Configure Your App
Steps:
➤Create a .env file containing: ➙
PORT=4000
➙MODE=development ➤Load environment variables using:
require("dotenv").config(); ➤Start your server using the port from .env
➤Print the mode:
App running in development mode ➤Add a rule:
If MODE = "development" → console.log all requests
If MODE = "production" → no logs allowed
Hint: Use app.use() to create a simple logger middleware.
✅ Challenge 3 — Build an API That Reads a File Safely
➤Create a route:
GET /notes ➤Requirements:
Read notes.json using fs
➙If the file is missing → trigger an error using next(err)
➙If JSON is broken → catch the error and forward it to the error handler
➙If everything is fine → return the notes
➤Your global error middleware should send clean output:
{ "success": false, "message": "Could not read notes file" } Hint: Use:
try { ... } catch(err) { next(err); }💥share your solutions in the group,
💥invite a friend,
and as always —
💥stay well, stay curious, and stay coding ✌️
🚀 Want to Learn Python or Web Development?
Hey everyone 👋✨
I’m starting beginner-friendly PAID lessons for anyone who wants to learn Python basics or Web Development (HTML, CSS, JavaScript) from zero.
You can learn online or in person, whichever is comfortable for you.
If you're interested, just message:
“Python” or “Web Dev” to @Tarikey6
I’ll send you the full details and schedule.
Let’s level up your skills! 💻🔥
Hey everyone 👋✨
I’m starting beginner-friendly PAID lessons for anyone who wants to learn Python basics or Web Development (HTML, CSS, JavaScript) from zero.
You can learn online or in person, whichever is comfortable for you.
If you're interested, just message:
“Python” or “Web Dev” to @Tarikey6
I’ll send you the full details and schedule.
Let’s level up your skills! 💻🔥
Forwarded from Channel Unwrapped
Channel Summary for 2025 🎉
Views
• 290 Total Posts
• 90 Average Views
• 26,367 Total Views
Top Post
• 1,337 Views
• https://t.me/fullstackCampp/158
Activity
• 6 AM is when you were most active
• Monday is your most active day
• July is your most active month
@channel_unwrapped_bot
Views
• 290 Total Posts
• 90 Average Views
• 26,367 Total Views
Top Post
• 1,337 Views
• https://t.me/fullstackCampp/158
Activity
• 6 AM is when you were most active
• Monday is your most active day
• July is your most active month
@channel_unwrapped_bot
❤3
🚀 Week 7 Day 7 — Express Router & Useful NPM Packages
Alright campers 🔥💙
I hope you’re rested, hydrated, and still coding with curiosity. I apologize for not posting these weeks-life happened.
Today is our last lesson for Express basics before we move to even bigger things.
🌳 BIG IDEA:
When your project grows, all your routes in app.js become messy and hard to manage.
👉 The solution?
📦 Modularization
🛣️ Express Router
Just like a house has many rooms, your Express app should have many route files, not one chaotic room.
🧭 1️⃣ Why Router?
⚠️ PROBLEM: When your application grows:
All inside app.js…
It becomes a mess 😵
🧠 Router allows you to split routes into logical files:
s
Each file handles only one thing → clean, organized code.
🛠️ 2️⃣ Create a Router
👉 Step 1: Create a folder
👉 Step 2: Create users.js
👉 Step 3: Use it in app.js
🎉 Now:
GET /users → gets all users
POST /users → creates new user
🪄 Cleaner, better, scalable.
📦 3️⃣ Another Example: posts.
er;
In app
Now you have:
/posts
/posts/123
💡 This is URL prefixing.
✨ 4️⃣ Benefits of Router
🔥 1. Clean code
🔥 2. Easier debugging
🔥 3. Can handle large projects
🔥 4. Can assign middleware per router
🔥 5. Can add separate controllers later
Imagine running a restaurant:
➙Kitchen
➙Cashier
➙Delivery
➙Cleaning
Each has their own place.
Same for routes.
🎯 Very Useful Pattern
Structure:
Later we will move logic from routes → controllers.
🧰 5️⃣ NPM Packages Commonly Used with Express
Below are must-know tools.
You’ll use them in almost every real backend.
1️⃣ morgan — Logging requests
Shows every request in console:
➙
Install:
Use:
2️⃣ cors — Cross Origin Resource Sharing
Frontend and backend are different origins.
If frontend is: http://localhost:5173 Backend is: http://localhost:3000
Browser blocks requests ❌ unless we allow.
Install:
Use:
3️⃣ uuid — Unique IDs
Instead of inventing IDs:
Every new resource gets a unique identifier.
4️⃣ dotenv — Environment Variables
Instead of writing this in code:
Put it in .env:
Load it:
Use it:
5️⃣ nodemon — Auto restart server ❤️
When you save file → server restarts automatically.
Install:
Run:
This saves hours of pain.
📚 Documentation
📘 Express Router: https://expressjs.com/en/guide/routing.html
📘 Morgan: https://www.npmjs.com/package/morgan
📘 CORS: https://www.npmjs.com/package/cors
Alright campers 🔥💙
I hope you’re rested, hydrated, and still coding with curiosity. I apologize for not posting these weeks-life happened.
Today is our last lesson for Express basics before we move to even bigger things.
🌳 BIG IDEA:
When your project grows, all your routes in app.js become messy and hard to manage.
👉 The solution?
📦 Modularization
🛣️ Express Router
Just like a house has many rooms, your Express app should have many route files, not one chaotic room.
🧭 1️⃣ Why Router?
⚠️ PROBLEM: When your application grows:
app.get('/users')
app.post('/users')
app.get('/posts')
app.delete('/posts/:id')
app.put('/products/:id') ...
All inside app.js…
It becomes a mess 😵
🧠 Router allows you to split routes into logical files:
routes/users.js
routes/posts.js
routes/products.j
s
Each file handles only one thing → clean, organized code.
🛠️ 2️⃣ Create a Router
👉 Step 1: Create a folder
/routes 👉 Step 2: Create users.js
const express = require("express");
const router = express.Router();
// Routes
router.get("/", (req, res) => {
res.send("Get all users"); });
router.post("/", (req, res) => {
res.send("Create new user"); });
module.exports = router; 👉 Step 3: Use it in app.js
;
const usersRoute = require("./routes/users");
app.use("/users", usersRoute)
🎉 Now:
GET /users → gets all users
POST /users → creates new user
🪄 Cleaner, better, scalable.
📦 3️⃣ Another Example: posts.
js
const express = require("express");
const router = express.Router();
router.get("/", (req, res) => {
res.send("All posts"); });
router.get("/:id", (req, res) => {
res.send("Single post with ID " + req.params.id); });
module.exports = rout
er;
In app
.js:ute);
const postsRoute = require("./routes/posts");
app.use("/posts", postsRo
Now you have:
/posts
/posts/123
💡 This is URL prefixing.
✨ 4️⃣ Benefits of Router
🔥 1. Clean code
🔥 2. Easier debugging
🔥 3. Can handle large projects
🔥 4. Can assign middleware per router
🔥 5. Can add separate controllers later
Imagine running a restaurant:
➙Kitchen
➙Cashier
➙Delivery
➙Cleaning
Each has their own place.
Same for routes.
🎯 Very Useful Pattern
Structure:
project/
│ app.js
│ package.json
│
├─ routes/
│
├─ users.js
│
├─ posts.js
│
└─ controllers/
├─ usersController.js
├─ postsController.js Later we will move logic from routes → controllers.
🧰 5️⃣ NPM Packages Commonly Used with Express
Below are must-know tools.
You’ll use them in almost every real backend.
1️⃣ morgan — Logging requests
Shows every request in console:
➙
GET /users 200 12ms
➙ POST /login 401 5ms Install:
npm install morgan Use:
const morgan = require("morgan"); app.use(morgan("dev")); 2️⃣ cors — Cross Origin Resource Sharing
Frontend and backend are different origins.
If frontend is: http://localhost:5173 Backend is: http://localhost:3000
Browser blocks requests ❌ unless we allow.
Install:
npm install cors Use:
const cors = require("cors"); app.use(cors()); 3️⃣ uuid — Unique IDs
Instead of inventing IDs:
const { v4: uuid } = require("uuid"); const user = { id: uuid(), name: "John" }; Every new resource gets a unique identifier.
4️⃣ dotenv — Environment Variables
Instead of writing this in code:
const PORT = 3000; Put it in .env:
PORT=3000 DATABASE_URL=... Load it:
require("dotenv").config(); Use it:
app.listen(process.env.PORT); 5️⃣ nodemon — Auto restart server ❤️
When you save file → server restarts automatically.
Install:
npm install -g nodemon Run:
nodemon app.js This saves hours of pain.
📚 Documentation
📘 Express Router: https://expressjs.com/en/guide/routing.html
📘 Morgan: https://www.npmjs.com/package/morgan
📘 CORS: https://www.npmjs.com/package/cors
Expressjs
Express routing
Learn how to define and use routes in Express.js applications, including route methods, route paths, parameters, and using Router for modular routing.
💥Week 7 Day 7 challenges
🧩 Challenge 1: Modular Blog API
👉 Build a small blog API using Express Router.
Requirements:
Create routes folder
🗂️ posts.js
🗂️ authors.js
Each file should export a router
Main app.js must use them like:
Endpoints to include (just dummy responses):
✔ /posts/ → return list of posts
✔ /posts/:id → return a single post
✔ /authors/ → return list of authors
✔ /authors/:id → return author details
Add middleware:
Use morgan for request logging
Use uuid to generate post IDs
🧩 Challenge 2: Notes API with Router + File Storage
👉 Build a simple Notes API, split into modules:
📁 /routes/notes.js
📁 /data/notes.json
Endpoints:
✔ GET /notes → return all notes
✔ POST /notes → add a new note
✔ DELETE /notes/:id → delete a note
Requirements:
➙Use uuid to generate IDs
➙Use fs to read/write JSON file
➙Use express.json()` middleware
Extra:
Add CORS package so any frontend can access it
🧩 Challenge 3: Student Manager
👉 Create Student Manager with:
📁 /routes/students.js
📁 /data/students.json
Endpoints:
✔ GET /students
✔ POST /students
✔ GET /students/:id
✔ DELETE /students/:id
Use packages:
dotenv → load PORT from .env
nodemon → auto restart
.env example:
🎁 Optional Bonus
Add routes with Router-level middleware:
Example:
When you are done:
💥share your solutions in the group,
💥invite a friend,
and as always —
💥stay well, stay curious, and stay coding ✌️
🧩 Challenge 1: Modular Blog API
👉 Build a small blog API using Express Router.
Requirements:
Create routes folder
🗂️ posts.js
🗂️ authors.js
Each file should export a router
Main app.js must use them like:
app.use("/posts", postsRouter); app.use("/authors", authorsRouter); Endpoints to include (just dummy responses):
✔ /posts/ → return list of posts
✔ /posts/:id → return a single post
✔ /authors/ → return list of authors
✔ /authors/:id → return author details
Add middleware:
Use morgan for request logging
Use uuid to generate post IDs
🧩 Challenge 2: Notes API with Router + File Storage
👉 Build a simple Notes API, split into modules:
📁 /routes/notes.js
📁 /data/notes.json
Endpoints:
✔ GET /notes → return all notes
✔ POST /notes → add a new note
✔ DELETE /notes/:id → delete a note
Requirements:
➙Use uuid to generate IDs
➙Use fs to read/write JSON file
➙Use express.json()` middleware
Extra:
Add CORS package so any frontend can access it
🧩 Challenge 3: Student Manager
👉 Create Student Manager with:
📁 /routes/students.js
📁 /data/students.json
Endpoints:
✔ GET /students
✔ POST /students
✔ GET /students/:id
✔ DELETE /students/:id
Use packages:
dotenv → load PORT from .env
nodemon → auto restart
.env example:
PORT=4000 🎁 Optional Bonus
Add routes with Router-level middleware:
Example:
router.use((req, res, next) => {
console.log("Students Router middleware running");
next(); });When you are done:
💥share your solutions in the group,
💥invite a friend,
and as always —
💥stay well, stay curious, and stay coding ✌️
Full Stack Camp pinned «👋 Welcome to Fullstack Summer Camp 2025! Learn. Build. Launch. Hey campers! 🌞 This is your one-stop space to master fullstack web development from scratch — right here on Telegram. Over the next 12 weeks, we’ll dive deep into: 🌐 Frontend: HTML, CSS, JavaScript…»
Full Stack Camp pinned «Week 1 Day 1 💡 What Is Coding? How It Works, Why It Matters, and How You Can Start 🌞 Welcome welcome welcome to Fullstack Summer Camp! ሰላምምምም 👋 Today is Day 1 of our fullstack development journey. Whether you're here because you're curious, bored, or…»
1️⃣ What is the main purpose of Express Router?
Anonymous Quiz
40%
a) To start the server
0%
b) To handle HTTP protocols
60%
c) To organize routes into modular files
0%
d) To replace middleware
2️⃣ Which line correctly creates a router instance?
Anonymous Quiz
40%
a) const router = express()
20%
b) const router = new Router()
40%
c) const router = express.Router()
0%
d) const router = require("router")
3️⃣ What does app.use("/users", usersRouter) do?
Anonymous Quiz
67%
a) Starts the users server
0%
b) Attaches middleware only for POST requests
33%
c) Prefixes all routes in usersRouter with /users
0%
d) Registers error middleware
4️⃣How do you read route parameters in Express?
Anonymous Quiz
0%
a) req.query
50%
b) req.params
50%
c) req.body
0%
d) req.route
5️⃣Which request URL matches this route? app.get("/products/:id")
Anonymous Quiz
67%
a) /products?id=5
33%
b) /products/5
0%
c) /product/5
0%
d) /products?id=:id
6️⃣What happens if you send two responses in one request?
Anonymous Quiz
0%
a) Express ignores the second one
50%
b) Server crashes
50%
c) Browser handles it
0%
d) Express throws an error
7️⃣Which package helps log HTTP requests?
Anonymous Quiz
100%
a) cors
0%
b) dotenv
0%
c) morgan
0%
d) uuid
8️⃣What problem does cors solve?
Anonymous Quiz
50%
a) Server crashes
0%
b) Cross-origin request blocking
50%
c) File uploads
0%
d) Route duplication
9️⃣Where should sensitive data like API keys be stored?
Anonymous Quiz
0%
a) In JavaScript files
0%
b) In package.json
100%
c) In .env file
0%
d) In routes
🔟How do you set an HTTP status code in Express?
Anonymous Quiz
0%
a) res.send(404)
50%
b) res.status(404).send()
50%
c) req.status(404)
0%
d) res.code(404)