Bird
Raised Fist0
Expressframework~10 mins

Request context middleware in Express - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Request context middleware
Incoming HTTP Request
↓
Middleware 1: Setup Context
↓
Attach Context to req
↓
Next Middleware or Route Handler
↓
Use Context in Handlers
↓
Send Response
↓
Request Ends
The middleware intercepts each request, creates a context object, attaches it to the request, then passes control to the next handler which can use this context.
Execution Sample
Express
app.use((req, res, next) => {
  req.context = { requestId: Date.now() };
  next();
});

app.get('/', (req, res) => {
  res.send(`ID: ${req.context.requestId}`);
});
This middleware adds a unique requestId to each request's context, which the route handler then uses in the response.
Execution Table
StepActionreq.context BeforeAction Resultreq.context AfterNext Called
1Incoming request arrivesundefinedMiddleware runsundefinedNo
2Middleware sets req.contextundefinedreq.context = {requestId: timestamp}{requestId: 1680000000000}No
3Middleware calls next(){requestId: 1680000000000}Pass control to next handler{requestId: 1680000000000}Yes
4Route handler reads req.context{requestId: 1680000000000}Reads requestId{requestId: 1680000000000}N/A
5Route handler sends response{requestId: 1680000000000}Response sent with ID{requestId: 1680000000000}N/A
6Request ends{requestId: 1680000000000}Connection closed{requestId: 1680000000000}N/A
💡 Request ends after response is sent and connection closes.
Variable Tracker
VariableStartAfter Step 2After Step 3Final
req.contextundefined{requestId: 1680000000000}{requestId: 1680000000000}{requestId: 1680000000000}
Key Moments - 3 Insights
Why is req.context undefined before the middleware runs?
Because req.context is not a built-in property; the middleware creates and attaches it at step 2 as shown in the execution_table.
What happens if next() is not called in the middleware?
The request will hang and never reach the route handler, because next() passes control forward, as seen between steps 2 and 3.
Can the route handler modify req.context?
Yes, since req.context is attached to the request object, the handler can read or update it after middleware sets it, as shown in step 4.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is req.context after step 2?
Anull
Bundefined
C{requestId: 1680000000000}
D{}
💡 Hint
Check the 'req.context After' column in row for step 2.
At which step does the middleware pass control to the next handler?
AStep 1
BStep 3
CStep 4
DStep 5
💡 Hint
Look for 'Next Called' column showing 'Yes' in the execution_table.
If the middleware did not set req.context, what would the route handler see?
Areq.context would be undefined
Breq.context would be an empty object
Creq.context would be null
Dreq.context would have a default requestId
💡 Hint
Refer to the variable_tracker start value and step 2 in execution_table.
Concept Snapshot
Request context middleware in Express:
- Middleware runs on every request
- Creates a context object (e.g., req.context)
- Attaches it to req for downstream use
- Calls next() to continue processing
- Route handlers access req.context for request-specific data
Full Transcript
In Express, request context middleware runs on each incoming HTTP request. It creates a context object, such as a unique requestId, and attaches it to the request object as req.context. This allows later middleware or route handlers to access and use this context data. The middleware must call next() to pass control forward. The route handler then reads req.context and can use it to customize the response. The request ends after the response is sent and the connection closes.

Practice

(1/5)
1. What is the main purpose of request context middleware in Express?
easy
A. To serve static files like images and CSS
B. To handle database connections globally for all requests
C. To store and share data specific to each request across middleware and routes
D. To manage user authentication tokens only

Solution

  1. Step 1: Understand request context middleware role

    Request context middleware stores data that belongs to a single request, making it accessible throughout that request's lifecycle.
  2. Step 2: Compare with other options

    The other options describe different middleware roles but not the core purpose of request context middleware.
  3. Final Answer:

    To store and share data specific to each request across middleware and routes -> Option C
  4. Quick Check:

    Request context middleware = store per-request data [OK]
Hint: Remember: context middleware holds data per request only [OK]
Common Mistakes:
  • Confusing request context with global app state
  • Thinking it manages static files
  • Assuming it only handles authentication
2. Which of the following is the correct way to add a property to the request context in Express middleware?
easy
A. req.context = { userId: 123 }; next();
B. res.context.userId = 123; next();
C. app.context.userId = 123; next();
D. context.userId = 123; next();

Solution

  1. Step 1: Identify where to store request-specific data

    In Express, the request object (req) is unique per request, so adding a property to req is correct.
  2. Step 2: Check other options for correctness

    res is for response, app is global, and context alone is undefined, so only req.context works properly.
  3. Final Answer:

    req.context = { userId: 123 }; next(); -> Option A
  4. Quick Check:

    Store data on req object for request context [OK]
Hint: Attach context data to req, not res or app [OK]
Common Mistakes:
  • Using res or app instead of req for context
  • Forgetting to call next() after middleware
  • Assigning context to undefined variable
3. Given this middleware and route, what will be the output when a GET request is made to /user?
app.use((req, res, next) => {
  req.context = { user: 'Alice' };
  next();
});

app.get('/user', (req, res) => {
  res.send(`User: ${req.context.user}`);
});
medium
A. User: Alice
B. User: undefined
C. Error: Cannot read property 'user' of undefined
D. User:

Solution

  1. Step 1: Analyze middleware setting req.context

    The middleware sets req.context to an object with user property 'Alice' before passing control.
  2. Step 2: Check route handler usage

    The route reads req.context.user and sends it in the response, so it will output 'User: Alice'.
  3. Final Answer:

    User: Alice -> Option A
  4. Quick Check:

    Middleware sets req.context.user = 'Alice' [OK]
Hint: Middleware runs before route, so context is set [OK]
Common Mistakes:
  • Assuming req.context is undefined in route
  • Forgetting middleware runs before route
  • Confusing res.context with req.context
4. Identify the error in this request context middleware code:
app.use((req, res, next) => {
  req.context.user = 'Bob';
  next();
});
medium
A. Middleware should not modify req object
B. req.context is undefined, so assigning user property causes an error
C. res object is used incorrectly
D. next() is missing, so request hangs

Solution

  1. Step 1: Check initialization of req.context

    The code tries to assign user to req.context.user, but req.context was never created, so it's undefined.
  2. Step 2: Understand the error cause

    Accessing a property on undefined causes a runtime error. next() is called, so no hanging issue.
  3. Final Answer:

    req.context is undefined, so assigning user property causes an error -> Option B
  4. Quick Check:

    Initialize req.context before adding properties [OK]
Hint: Always initialize req.context before use [OK]
Common Mistakes:
  • Not initializing req.context as an object
  • Forgetting to call next()
  • Misusing res instead of req
5. You want to store a request ID in the context for every request and access it in multiple routes. Which is the best way to implement this in Express?
hard
A. Pass requestId as a query parameter in every route URL
B. Store requestId in a global variable and access it in routes
C. Attach requestId to res.locals and access it in routes
D. Create middleware that sets req.context = { requestId: uniqueId } and call next(), then read req.context.requestId in routes

Solution

  1. Step 1: Understand request-specific data storage

    Request ID is unique per request, so it must be stored in a per-request object like req.context.
  2. Step 2: Evaluate options for sharing data

    Global variables cause conflicts between concurrent requests, query parameters are not suitable for internal data sharing, and res.locals is primarily for template data rather than request processing.
  3. Final Answer:

    Create middleware that sets req.context = { requestId: uniqueId } and call next(), then read req.context.requestId in routes -> Option D
  4. Quick Check:

    Use req.context for per-request data sharing [OK]
Hint: Use middleware to set req.context with request ID [OK]
Common Mistakes:
  • Using global variables for request data
  • Relying on query parameters for context
  • Confusing res.locals with request context
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard