🏠 Home / Hub

🟢 Node.js Lesson 04 — Express.js

← Back to Node.js Menu  |  🏠 Hub

1. Express Setup

# Install
npm init -y
npm install express

# server.js
const express = require('express');
const app = express();

app.use(express.json());           // parse JSON body
app.use(express.urlencoded({ extended: true })); // parse form data

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server running at http://localhost:${PORT}`);
});
Express = Node.js HTTP module ကို wrap ထားတဲ့ minimal web framework — routing, middleware easy

2. Routes

// Basic routes
app.get('/', (req, res) => {
  res.send('Hello World!');           // text response
});

app.get('/json', (req, res) => {
  res.json({ message: 'OK', time: new Date() }); // JSON response
});

app.get('/status', (req, res) => {
  res.status(200).json({ status: 'healthy' });
});

// Route parameters (dynamic segments)
app.get('/users/:id', (req, res) => {
  const { id } = req.params;
  res.json({ userId: id });
});

// Multiple params
app.get('/posts/:postId/comments/:commentId', (req, res) => {
  const { postId, commentId } = req.params;
  res.json({ postId, commentId });
});

// Query string: /search?q=hello&page=2
app.get('/search', (req, res) => {
  const { q, page = 1, limit = 10 } = req.query;
  res.json({ query: q, page: Number(page), limit: Number(limit) });
});

// POST with body
app.post('/users', (req, res) => {
  const { name, email } = req.body;
  // validate & save...
  res.status(201).json({ id: Date.now(), name, email });
});

// PUT / PATCH / DELETE
app.put('/users/:id',    (req, res) => { /* update */ });
app.patch('/users/:id',  (req, res) => { /* partial update */ });
app.delete('/users/:id', (req, res) => { res.status(204).end(); });

3. Middleware

// Middleware = function that runs BETWEEN request and response
// (req, res, next) — next() calls the NEXT middleware

// Global middleware (applies to all routes)
app.use((req, res, next) => {
  console.log(`${req.method} ${req.url} — ${new Date().toISOString()}`);
  next();   // continue to next middleware/route
});

// CORS middleware
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  next();
});

// Route-specific middleware
function authMiddleware(req, res, next) {
  const token = req.headers.authorization?.split(' ')[1];
  if (!token) return res.status(401).json({ error: 'No token' });
  // verify token...
  req.user = { id: 1, name: 'Ko' };  // attach to request
  next();
}

app.get('/profile', authMiddleware, (req, res) => {
  res.json(req.user);
});

// Error handling middleware (4 params — special!)
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: err.message });
});

// 404 handler (put LAST)
app.use((req, res) => {
  res.status(404).json({ error: 'Route not found' });
});

4. Static Files & Router

// Serve static files (HTML, CSS, images)
app.use(express.static('public'));
// Files in /public folder → accessible directly
// /public/index.html → http://localhost:3000/
// /public/css/style.css → http://localhost:3000/css/style.css

// Express Router — organize routes
// routes/users.js
const router = require('express').Router();

router.get('/',     (req, res) => res.json([/* users */]));
router.get('/:id',  (req, res) => res.json({ id: req.params.id }));
router.post('/',    (req, res) => res.status(201).json(req.body));
router.put('/:id',  (req, res) => res.json({ updated: req.params.id }));
router.delete('/:id',(req, res) => res.status(204).end());

module.exports = router;

// server.js
const userRoutes = require('./routes/users');
app.use('/api/users', userRoutes);
// /api/users → GET all
// /api/users/1 → GET by id
💡 Router = routes ကို file ခွဲထားနည်း — server.js က cluttered ဖြစ်မသွား

← Node.js 03  |  Next: Node.js 05 → REST API →

📌 Study Checklist