goDevelopers · Hustlers Hub · node + express · REST APIs
v4.x
React.js →
Fundamentals
Setup
install
npm init -y npm install express npm install -D nodemon
index.js
const express = require('express') const app = express() app.use(express.json()) app.listen(3000)
HTTP Methods
GETRead data
POSTCreate data
PUTReplace data
PATCHPartial update
DELETERemove data
Status Codes
200OK
201Created
204No Content
301Moved
400Bad Request
401Unauthorized
403Forbidden
404Not Found
500Server Error
503Unavailable
Routing & I/O
Route Patterns
// Basic routes app.get('/users', (req, res) => res.json({ users: [] })) app.post('/users', (req, res) => res.status(201).json(req.body)) // URL param → /users/42 app.get('/users/:id', (req, res) => { const { id } = req.params // "42" res.json({ id }) }) // Query string → /search?q=node&limit=5 app.get('/search', (req, res) => { const { q, limit } = req.query res.json({ q, limit }) })
req & res
req.bodyPOST payload
req.paramsURL :id values
req.query?key=val pairs
req.headersHTTP headers
res.json()Send JSON
res.status()Set status code
res.send()Send string/buffer
res.redirect()Redirect URL
Middleware

Runs between request → route handler. Must call next() or the request hangs forever.

// Custom logger middleware app.use((req, res, next) => { console.log(`${req.method} ${req.url}`) next() // pass to next handler }) // Apply only to specific routes app.get('/admin', authMiddleware, (req, res) => { ... })
Request
→
Middleware 1
→
Middleware 2
→
Route Handler
→
Response
Common Middleware
express.json()Parse JSON body
express.urlencoded()Parse form data
express.static()Serve static files
corsCross-origin requests
helmetSecurity headers
morganHTTP request logger
dotenvLoad .env variables
Architecture & Config
DB Connect Before Server Start
const mongoose = require('mongoose') mongoose.connect(process.env.MONGO_URI) .then(() => { console.log('DB connected') app.listen(3000, () => console.log('Server running')) }) .catch((err) => { console.error('DB failed', err) process.exit(1) // crash loudly — no DB = no point running })
Error Handling
// In route — catch & pass app.get('/data', async (req, res, next) => { try { const d = await fetchData() res.json(d) } catch (err) { next(err) } }) // Error handler — 4 args, placed LAST app.use((err, req, res, next) => { res.status(500).json({ error: err.message }) })
Router (file splitting)
// routes/users.js const r = require('express').Router() r.get('/', ...) r.post('/', ...) module.exports = r // index.js app.use('/users', require('./routes/users'))
Folder Structure
project/ ├── routes/ │ ├── users.js │ └── posts.js ├── middleware/ │ └── auth.js ├── controllers/ │ └── userController.js ├── .env ├── .gitignore └── index.js
Env Variables
.env file
PORT=3000 MONGO_URI=mongodb://... JWT_SECRET=supersecret
usage
require('dotenv').config() const port = process.env.PORT // NEVER commit .env to git
Common Mistakes
Biggest Beginner Mistakes — Hustlers Hub Warning Board
Forgetting express.json() Body is undefined on every POST. Add it before all routes.
Not calling next(err) in async Errors crash silently. Wrap in try/catch, pass err to next().
Sending response twice res.json() then res.send() = "headers already sent". One response only.
Error handler needs 4 args Express ignores it as error middleware if you use only 3 arguments.
Committing .env to Git Add .env to .gitignore immediately. Leaked secrets = major breach.
Test with Postman / Thunder Don't test APIs in a browser. GET works, POST/PUT/DELETE won't.