Bird
Raised Fist0
Expressframework~20 mins

Conditional requests handling in Express - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Conditional Requests Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What is the output when a client sends an If-None-Match header matching the ETag?

Consider this Express route that serves a resource with an ETag header:

app.get('/resource', (req, res) => {
  const data = 'Hello World';
  const etag = '12345';
  res.set('ETag', etag);
  if (req.headers['if-none-match'] === etag) {
    res.status(304).end();
  } else {
    res.send(data);
  }
});

If a client sends a request with header If-None-Match: 12345, what will the server respond with?

Express
app.get('/resource', (req, res) => {
  const data = 'Hello World';
  const etag = '12345';
  res.set('ETag', etag);
  if (req.headers['if-none-match'] === etag) {
    res.status(304).end();
  } else {
    res.send(data);
  }
});
AStatus 500 Internal Server Error
BStatus 304 with no body
CStatus 404 Not Found
DStatus 200 with body 'Hello World'
Attempts:
2 left
💡 Hint

Think about what the 304 status code means in HTTP.

📝 Syntax
intermediate
2:00remaining
Which option correctly sets Last-Modified header and handles If-Modified-Since?

Given this Express route, which option correctly implements conditional GET using Last-Modified?

app.get('/file', (req, res) => {
  const lastModified = new Date('2024-01-01T12:00:00Z');
  // Your code here
});
Express
app.get('/file', (req, res) => {
  const lastModified = new Date('2024-01-01T12:00:00Z');
  // Your code here
});
A
res.set('Last-Modified', lastModified.toUTCString());
if (req.headers['if-modified-since'] > lastModified.toUTCString()) {
  res.status(304).end();
} else {
  res.send('File content');
}
B
res.set('Last-Modified', lastModified);
if (req.headers['if-modified-since'] === lastModified.toUTCString()) {
  res.status(304).end();
} else {
  res.send('File content');
}
C
res.set('Last-Modified', lastModified.toUTCString());
if (new Date(req.headers['if-modified-since']) >= lastModified) {
  res.status(304).end();
} else {
  res.send('File content');
}
D
res.set('Last-Modified', lastModified.toISOString());
if (new Date(req.headers['if-modified-since']) < lastModified) {
  res.status(304).end();
} else {
  res.send('File content');
}
Attempts:
2 left
💡 Hint

Remember to compare dates as Date objects, not strings.

🔧 Debug
advanced
2:00remaining
Why does this Express code always send the full response ignoring If-None-Match?

Examine this code snippet:

app.get('/data', (req, res) => {
  const etag = 'abc123';
  res.set('ETag', etag);
  if (req.headers['if-none-match'] !== etag) {
    res.send('Data content');
  } else {
    res.status(304).end();
  }
});

Clients report they always get the full content, even when sending If-None-Match: abc123. What is the bug?

Express
app.get('/data', (req, res) => {
  const etag = 'abc123';
  res.set('ETag', etag);
  if (req.headers['if-none-match'] !== etag) {
    res.send('Data content');
  } else {
    res.status(304).end();
  }
});
AThe If-None-Match header may contain quotes, so direct string comparison fails
BETag header must be set after sending the response
CThe comparison should use strict equality === instead of !==
DThe status 304 must be sent before setting the ETag header
Attempts:
2 left
💡 Hint

Check the exact value format of the If-None-Match header sent by browsers.

❓ state_output
advanced
2:00remaining
What is the response status and body when If-Modified-Since is before Last-Modified?

Given this Express route:

app.get('/info', (req, res) => {
  const lastModified = new Date('2024-06-01T10:00:00Z');
  res.set('Last-Modified', lastModified.toUTCString());
  const ifModifiedSince = new Date(req.headers['if-modified-since']);
  if (ifModifiedSince >= lastModified) {
    res.status(304).end();
  } else {
    res.send('Updated info');
  }
});

If the client sends If-Modified-Since: 2024-05-01T10:00:00Z, what will the server respond?

Express
app.get('/info', (req, res) => {
  const lastModified = new Date('2024-06-01T10:00:00Z');
  res.set('Last-Modified', lastModified.toUTCString());
  const ifModifiedSince = new Date(req.headers['if-modified-since']);
  if (ifModifiedSince >= lastModified) {
    res.status(304).end();
  } else {
    res.send('Updated info');
  }
});
AStatus 200 with body 'Updated info'
BStatus 304 with no body
CStatus 400 Bad Request
DStatus 500 Internal Server Error
Attempts:
2 left
💡 Hint

Compare the dates carefully to see if the resource is newer than the client's cached version.

🧠 Conceptual
expert
2:00remaining
Which HTTP header combination best supports efficient conditional GET caching?

To implement efficient conditional GET caching in an Express app, which combination of headers should be used together?

AETag and Cache-Control headers
BLast-Modified and If-Modified-Since headers
CCache-Control and Pragma headers
DETag and If-None-Match headers
Attempts:
2 left
💡 Hint

Think about which headers allow precise validation of resource changes.

Practice

(1/5)
1. What is the main purpose of handling conditional requests in Express?
easy
A. To increase server processing time
B. To always send full response data regardless of cache
C. To reduce data sent by checking if the client cache is fresh
D. To disable client caching completely

Solution

  1. Step 1: Understand conditional requests concept

    Conditional requests check if the client already has fresh data to avoid sending it again.
  2. Step 2: Identify the purpose in Express

    Express uses conditional requests to reduce unnecessary data transfer by responding with 304 if data is fresh.
  3. Final Answer:

    To reduce data sent by checking if the client cache is fresh -> Option C
  4. Quick Check:

    Conditional requests reduce data transfer = B [OK]
Hint: Conditional requests save bandwidth by checking cache freshness [OK]
Common Mistakes:
  • Thinking conditional requests increase server load
  • Assuming full data is always sent
  • Believing caching is disabled by conditional requests
2. Which Express property is used to check if the request is fresh based on ETag or Last-Modified headers?
easy
A. res.isFresh()
B. res.checkFresh()
C. req.isFresh()
D. req.fresh

Solution

  1. Step 1: Recall Express request object properties

    The freshness of a request is checked on the request object, not the response.
  2. Step 2: Identify the correct property name

    Express provides req.fresh to check if the request is fresh based on headers.
  3. Final Answer:

    req.fresh -> Option D
  4. Quick Check:

    Check freshness with req.fresh = B [OK]
Hint: Use req.fresh to check cache freshness in Express [OK]
Common Mistakes:
  • Using res.isFresh() instead of req.fresh
  • Confusing property names like req.isFresh() which don't exist
  • Trying to check freshness on response object
3. What will the following Express code send if the client sends a matching ETag header?
app.get('/data', (req, res) => {
  res.set('ETag', '12345');
  if (req.fresh) {
    res.status(304).end();
  } else {
    res.send('Full data response');
  }
});
medium
A. Full data response with status 200
B. Status 304 with no body
C. Status 500 error
D. Empty response with status 200

Solution

  1. Step 1: Understand ETag and req.fresh

    The server sets ETag '12345'. If the client sends the same ETag, req.fresh returns true.
  2. Step 2: Analyze the conditional response

    If req.fresh is true, the server responds with status 304 and ends response without body.
  3. Final Answer:

    Status 304 with no body -> Option B
  4. Quick Check:

    Matching ETag triggers 304 no body = A [OK]
Hint: Matching ETag means send 304 status with empty body [OK]
Common Mistakes:
  • Sending full data even when ETag matches
  • Returning status 200 with empty body
  • Confusing 304 with error status
4. Identify the error in this Express route handling conditional requests:
app.get('/info', (req, res) => {
  res.set('Last-Modified', new Date().toUTCString());
  if (req.fresh()) {
    res.status(304).end();
  } else {
    res.send('Info data');
  }
});
medium
A. Calling req.fresh() with parentheses (it's a property)
B. Setting Last-Modified header incorrectly
C. Missing res.send() in both branches
D. Using arrow function incorrectly

Solution

  1. Step 1: Check usage of req.fresh

    req.fresh is a property and must be accessed without parentheses: req.fresh
  2. Step 2: Verify other parts

    Last-Modified header is set correctly, res.send() is called in else branch, arrow function syntax is correct.
  3. Final Answer:

    Calling req.fresh() with parentheses (it's a property) -> Option A
  4. Quick Check:

    Property access needs no () = A [OK]
Hint: Always access req.fresh without parentheses [OK]
Common Mistakes:
  • Treating req.fresh as a method by adding parentheses
  • Misformatting Last-Modified header
  • Not sending response in all branches
5. You want to optimize an Express API to support conditional requests using both ETag and Last-Modified headers. Which approach correctly implements this to respond with 304 when appropriate? A) Set ETag and Last-Modified headers, then check req.fresh to send 304 or full data. B) Only set ETag header and always send full data. C) Set Last-Modified header but never check req.fresh, always send 200. D) Use req.fresh without setting any headers.
hard
A. Set ETag and Last-Modified headers, then check req.fresh to send 304 or full data
B. Only set ETag header and always send full data
C. Set Last-Modified header but never check req.fresh, always send 200
D. Use req.fresh without setting any headers

Solution

  1. Step 1: Understand headers and freshness check

    ETag and Last-Modified headers must be set for conditional requests to work properly.
  2. Step 2: Use req.fresh to decide response

    req.fresh checks these headers and client cache; if fresh, respond 304, else send full data.
  3. Step 3: Evaluate options

    Only Set ETag and Last-Modified headers, then check req.fresh to send 304 or full data: Set ETag and Last-Modified headers, then check req.fresh to send 304 or full data correctly sets headers and uses req.fresh to conditionally send 304 or data.
  4. Final Answer:

    Set ETag and Last-Modified headers, then check req.fresh to send 304 or full data -> Option A
  5. Quick Check:

    Set headers + check req.fresh = D [OK]
Hint: Set headers and check req.fresh to send 304 or data [OK]
Common Mistakes:
  • Not setting headers but checking freshness
  • Setting headers but ignoring req.fresh
  • Using req.fresh without headers
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