Express Middleware
Middleware is a function that runs between the incoming request and your final response, with the signature (req, res, next) , letting you log, parse, authenticate, or transform every request in a pipeline.
Learn Express Middleware in our free Node.js course — a beginner-friendly interactive lesson with worked examples, a practice exercise and a quick reference.
Part of the free Node.js course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.
By the end of this lesson you'll write your own middleware, understand why order matters, share data down the chain with req , use built-in parsers like express.json() , and add a catch-all error handler.
What You'll Learn in This Lesson
1️⃣ What Middleware Is
A middleware function takes three arguments: req (the request), res (the response), and next (a function that hands control to whatever comes next). Register it with app.use() and it runs for every request. The golden rule: always either call next() or send a response.
The middleware logged the request, then called next() to let the route handler send the actual reply. Drop the next() and the browser would spin forever — the request would never reach the handler.
2️⃣ Order Matters: a Pipeline
Middleware runs in registration order, like a pipeline. Each function can attach data to req so later functions — including your route handler — can read it. This is how things like the logged-in user or a request timer get shared down the chain.
The logger ran first, then auth, then the handler — exactly the order they were registered. Because each stored data on req , the final handler could read both req.startTime and req.user .
3️⃣ Built-in and Error-Handling Middleware
Express bundles useful middleware. express.json() parses a JSON request body onto req.body . And a special error-handling middleware — recognized by its four arguments (err, req, res, next) — catches anything that throws, so you can return a clean error instead of crashing.
Your turn. Fill in the two ___ blanks to complete a logger and a timestamp middleware, then run it.
Write a middleware that only lets the request through when ?key=secret is present, and rejects everything else with a 401. Register it before your routes.
📋 Quick Reference — Express Middleware
Practice quiz
What is the standard signature of an Express middleware function?
- (req, res, next)
- (request)
- (next, req)
- (err, data)
Answer: (req, res, next). Middleware receives the request, the response, and next().
What must you call to pass control to the next handler in the chain?
- continue()
- next()
- pass()
- done()
Answer: next(). Calling next() hands control to the following middleware or route.
What happens if a middleware forgets to call next() (and never responds)?
- Express auto-calls next
- It skips to the route
- It logs a warning only
- The request hangs forever
Answer: The request hangs forever. Without next() or a response, the request never completes and hangs.
Which method registers middleware that runs for EVERY request?
- app.get()
- app.route()
- app.use()
- app.all()
Answer: app.use(). app.use() registers middleware that runs on every incoming request.
In what order does middleware run?
- In the order it is registered
- Alphabetically
- Randomly
- Reverse of registration
Answer: In the order it is registered. Middleware executes as a pipeline, in registration order.
Which built-in middleware parses an incoming JSON request body?
- express.text()
- express.json()
- express.raw()
- express.body()
Answer: express.json(). express.json() parses JSON bodies and puts the result on req.body.
Without express.json(), what is req.body for a JSON POST?
- An empty array
- The raw string
- undefined
- An error object
Answer: undefined. Without a body parser, req.body is undefined.
How does Express recognize ERROR-handling middleware?
- By a special name
- By a decorator
- By a config flag
- By its four arguments (err, req, res, next)
Answer: By its four arguments (err, req, res, next). The four-argument signature (err, req, res, next) marks it as error middleware.
How can one middleware share data with later handlers?
- By attaching it to the req object
- Using a global variable only
- It cannot share data
- By returning it
Answer: By attaching it to the req object. Attaching properties to req (e.g. req.user) passes data down the chain.
Which status code does the example error handler send with res.status(...)?
- 200
- 500
- 404
- 201
Answer: 500. The error handler responds with res.status(500) for a server error.