npm init -y
npm install express
npm install -D nodemonconst express = require('express')
const app = express()
app.use(express.json())
app.listen(3000)| GET | Read data |
| POST | Create data |
| PUT | Replace data |
| PATCH | Partial update |
| DELETE | Remove data |
// 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.body | POST payload |
| req.params | URL :id values |
| req.query | ?key=val pairs |
| req.headers | HTTP headers |
| res.json() | Send JSON |
| res.status() | Set status code |
| res.send() | Send string/buffer |
| res.redirect() | Redirect URL |
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) => { ... })| express.json() | Parse JSON body |
| express.urlencoded() | Parse form data |
| express.static() | Serve static files |
| cors | Cross-origin requests |
| helmet | Security headers |
| morgan | HTTP request logger |
| dotenv | Load .env variables |
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
})// 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 })
})// routes/users.js
const r = require('express').Router()
r.get('/', ...)
r.post('/', ...)
module.exports = r
// index.js
app.use('/users', require('./routes/users'))project/
├── routes/
│ ├── users.js
│ └── posts.js
├── middleware/
│ └── auth.js
├── controllers/
│ └── userController.js
├── .env
├── .gitignore
└── index.jsPORT=3000
MONGO_URI=mongodb://...
JWT_SECRET=supersecretrequire('dotenv').config()
const port = process.env.PORT
// NEVER commit .env to git