Topics Express.js Framework Routing & Controllers
intermediate 17 min read

Routing & Controllers

Advanced routing techniques, Router, controllers, and request validation.

Express Router

// routes/users.js\nconst express = require('express');\nconst router = express.Router();\n\nrouter.get('/', (req, res) => {\n  res.json(User.getAll());\n});\n\nrouter.post('/', (req, res) => {\n  const user = User.create(req.body);\n  res.status(201).json(user);\n});\n\nrouter.get('/:id', (req, res) => {\n  const user = User.findById(req.params.id);\n  if (!user) return res.status(404).json({ error: 'Not found' });\n  res.json(user);\n});\n\nmodule.exports = router;\n\n// app.js\nconst userRoutes = require('./routes/users');\napp.use('/api/users', userRoutes);

Chained Routes

app.route('/api/items')\n  .get((req, res) => { /* list */ })\n  .post((req, res) => { /* create */ });\n\napp.route('/api/items/:id')\n  .get((req, res) => { /* get */ })\n  .put((req, res) => { /* update */ })\n  .delete((req, res) => { /* delete */ });

Validation

// Manual validation\napp.post('/api/users', (req, res) => {\n  const { name, email, age } = req.body;\n  \n  const errors = [];\n  if (!name || name.length < 2) errors.push('Name is required (min 2 chars)');\n  if (!email || !email.includes('@')) errors.push('Valid email is required');\n  if (age && (age < 0 || age > 150)) errors.push('Invalid age');\n  \n  if (errors.length) {\n    return res.status(422).json({ errors });\n  }\n  \n  res.status(201).json({ message: 'User created' });\n});

Examples

const express = require('express');
const router = express.Router();

// In-memory store
let items = [];
let nextId = 1;

router.get('/', (req, res) => {
  const { limit = 10, offset = 0 } = req.query;
  res.json({
    data: items.slice(Number(offset), Number(offset) + Number(limit)),
    total: items.length,
  });
});

router.get('/:id', (req, res) => {
  const item = items.find(i => i.id === Number(req.params.id));
  if (!item) return res.status(404).json({ error: 'Not found' });
  res.json(item);
});

router.post('/', (req, res) => {
  const { name, price } = req.body;
  const item = { id: nextId++, name, price, created: new Date() };
  items.push(item);
  res.status(201).json(item);
});

router.put('/:id', (req, res) => {
  const idx = items.findIndex(i => i.id === Number(req.params.id));
  if (idx === -1) return res.status(404).json({ error: 'Not found' });
  items[idx] = { ...items[idx], ...req.body };
  res.json(items[idx]);
});

router.delete('/:id', (req, res) => {
  items = items.filter(i => i.id !== Number(req.params.id));
  res.status(204).end();
});

module.exports = router;

Your Notes

Sign in to take notes for this lesson.

Discussion

Sign in to join the discussion.

Flashcards

Sign in to create flashcards.