Day 1 of 5
⏱ ~60 minutes
Express.js in 5 Days — Day 1

Routes and Middleware

Set up an Express server, define routes for all HTTP methods, write middleware, and understand the request/response cycle.

Your First Express Server

Terminal
mkdir my-api && cd my-api
npm init -y
npm install express
npm install -D nodemon
server.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;

// Built-in middleware: parse JSON bodies
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Routes
app.get('/', (req, res) => {
  res.json({ message: 'API is running' });
});

app.get('/users/:id', (req, res) => {
  const { id } = req.params;           // route params
  const { page = 1 } = req.query;     // query string
  res.json({ id, page });
});

app.post('/users', (req, res) => {
  const { name, email } = req.body;   // JSON body
  // save to DB...
  res.status(201).json({ name, email });
});

app.listen(PORT, () => console.log(`Server on port ${PORT}`));
Custom Middleware
// Middleware: runs before route handlers
// Must call next() or the request hangs

// Request logger
app.use((req, res, next) => {
  console.log(`${req.method} ${req.path} ${new Date().toISOString()}`);
  next();
});

// Route-specific middleware
function requireApiKey(req, res, next) {
  const key = req.headers['x-api-key'];
  if (key !== process.env.API_KEY) {
    return res.status(401).json({ error: 'Unauthorized' });
  }
  next();
}

app.get('/secure', requireApiKey, (req, res) => {
  res.json({ secret: 'data' });
});
💡
Middleware order matters. Middleware defined with app.use() runs in order for every request. Put your logger first, auth middleware before protected routes, error handlers last.
📝 Day 1 Exercise
Build a REST API Skeleton
  1. C
  2. r
  3. e
  4. a
  5. t
  6. e
  7. a
  8. n
  9. E
  10. x
  11. p
  12. r
  13. e
  14. s
  15. s
  16. s
  17. e
  18. r
  19. v
  20. e
  21. r
  22. w
  23. i
  24. t
  25. h
  26. r
  27. o
  28. u
  29. t
  30. e
  31. s
  32. f
  33. o
  34. r
  35. a
  36. r
  37. e
  38. s
  39. o
  40. u
  41. r
  42. c
  43. e
  44. o
  45. f
  46. y
  47. o
  48. u
  49. r
  50. c
  51. h
  52. o
  53. i
  54. c
  55. e
  56. (
  57. b
  58. o
  59. o
  60. k
  61. s
  62. ,
  63. t
  64. a
  65. s
  66. k
  67. s
  68. ,
  69. r
  70. e
  71. c
  72. i
  73. p
  74. e
  75. s
  76. )
  77. .
  78. I
  79. n
  80. c
  81. l
  82. u
  83. d
  84. e
  85. G
  86. E
  87. T
  88. a
  89. l
  90. l
  91. ,
  92. G
  93. E
  94. T
  95. b
  96. y
  97. I
  98. D
  99. ,
  100. P
  101. O
  102. S
  103. T
  104. ,
  105. P
  106. U
  107. T
  108. ,
  109. a
  110. n
  111. d
  112. D
  113. E
  114. L
  115. E
  116. T
  117. E
  118. .
  119. A
  120. d
  121. d
  122. a
  123. r
  124. e
  125. q
  126. u
  127. e
  128. s
  129. t
  130. l
  131. o
  132. g
  133. g
  134. e
  135. r
  136. m
  137. i
  138. d
  139. d
  140. l
  141. e
  142. w
  143. a
  144. r
  145. e
  146. .

Day 1 Summary

  • Express is a thin layer over Node's HTTP module. app.use() adds middleware. app.get/post/put/delete() adds routes.
  • Middleware signature: (req, res, next). Call next() to pass to the next handler.
  • req.params = route params. req.query = query string. req.body = parsed body (needs middleware).
  • res.json(data) sends JSON. res.status(201).json(data) sets the status code.
Finished this lesson?