Bird
Raised Fist0
Expressframework~10 mins

HTTP caching headers (ETag, Cache-Control) in Express - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to set a Cache-Control header that tells browsers to cache the response for 1 hour.

Express
app.get('/data', (req, res) => {
  res.set('[1]', 'public, max-age=3600');
  res.send({ message: 'Hello' });
});
Drag options to blanks, or click blank then click option'
AExpires
BContent-Type
CETag
DCache-Control
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'Content-Type' instead of 'Cache-Control'.
Confusing 'ETag' with cache duration headers.
2fill in blank
medium

Complete the code to generate an ETag header using the express built-in method.

Express
app.get('/resource', (req, res) => {
  res.[1]();
  res.send('Resource content');
});
Drag options to blanks, or click blank then click option'
Aetag
BsetETag
CgenerateETag
DsetHeader
Attempts:
3 left
💡 Hint
Common Mistakes
Trying to use 'setHeader' directly without generating ETag.
Using non-existent methods like 'generateETag'.
3fill in blank
hard

Fix the error in the code to properly check the client's ETag and respond with 304 if it matches.

Express
app.get('/file', (req, res) => {
  const etag = '12345';
  if (req.headers['if-none-match'] === [1]) {
    res.status(304).end();
  } else {
    res.set('ETag', etag);
    res.send('File content');
  }
});
Drag options to blanks, or click blank then click option'
AETag
Betag
C'etag'
D'ETag'
Attempts:
3 left
💡 Hint
Common Mistakes
Comparing to the string 'etag' instead of the variable etag.
Using 'ETag' which is not defined as a variable.
4fill in blank
hard

Fill both blanks to set Cache-Control to no-store and disable ETag generation.

Express
app.use((req, res, next) => {
  res.set('[1]', 'no-store');
  app.disable('[2]');
  next();
});
Drag options to blanks, or click blank then click option'
ACache-Control
Betag
CETag
DCache
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'ETag' instead of 'etag' in app.disable.
Setting wrong header names like 'Cache'.
5fill in blank
hard

Fill both blanks to create a middleware that sets Cache-Control to private, sets ETag, and sends JSON response.

Express
app.get('/profile', (req, res) => {
  res.set('[1]', 'private, max-age=600');
  res.[2]();
  res.send({ user: 'Alice', id: 1, });
});
Drag options to blanks, or click blank then click option'
ACache-Control
Betag
C,
D;
Attempts:
3 left
💡 Hint
Common Mistakes
Using semicolon instead of comma in JSON object.
Forgetting to call etag() method.
Setting wrong header name.

Practice

(1/5)
1. What is the main purpose of the ETag header in Express HTTP responses?
easy
A. To redirect the client to a different URL
B. To specify how long the browser should cache the resource
C. To identify a specific version of a resource for caching validation
D. To indicate the content type of the response

Solution

  1. Step 1: Understand the role of ETag

    The ETag header provides a unique identifier for a specific version of a resource, allowing the server to tell if the resource has changed.
  2. Step 2: Compare with other headers

    Cache-Control sets caching duration, redirects use Location header, and content type is set by Content-Type header, so these are not related to ETag.
  3. Final Answer:

    To identify a specific version of a resource for caching validation -> Option C
  4. Quick Check:

    ETag = version ID for caching [OK]
Hint: ETag tags resource versions to avoid unnecessary downloads [OK]
Common Mistakes:
  • Confusing ETag with Cache-Control duration
  • Thinking ETag redirects clients
  • Mixing ETag with content type headers
2. Which of the following is the correct way to set a Cache-Control header in Express to cache a response for 1 hour?
easy
A. res.set('Cache-Control', 'max-age=3600')
B. res.header('Cache-Control', 'no-cache')
C. res.cache('max-age=3600')
D. res.setHeader('Cache-Control', 'max-age=60')

Solution

  1. Step 1: Identify Express method to set headers

    Express uses res.set() or res.header() to set headers. Both work, but res.set() is common and correct here.
  2. Step 2: Check Cache-Control value for 1 hour

    1 hour = 3600 seconds, so max-age=3600 is correct. res.header('Cache-Control', 'no-cache') uses 'no-cache' which disables caching. res.cache('max-age=3600') is invalid method. res.setHeader('Cache-Control', 'max-age=60') sets max-age to 60 seconds, not 1 hour.
  3. Final Answer:

    res.set('Cache-Control', 'max-age=3600') -> Option A
  4. Quick Check:

    Cache-Control max-age=3600 sets 1 hour caching [OK]
Hint: Use res.set with 'max-age=seconds' for caching time [OK]
Common Mistakes:
  • Using wrong method like res.cache
  • Confusing seconds with minutes in max-age
  • Setting no-cache when caching is needed
3. Given this Express code snippet, what will the client receive if the request includes header If-None-Match matching the ETag?
app.get('/data', (req, res) => {
  const data = { message: 'Hello' };
  const etag = '12345';
  res.set('ETag', etag);
  if (req.headers['if-none-match'] === etag) {
    res.status(304).end();
  } else {
    res.json(data);
  }
});
medium
A. A 500 Internal Server Error
B. A 304 Not Modified status with no body
C. A 404 Not Found error
D. A JSON response with { message: 'Hello' }

Solution

  1. Step 1: Check If-None-Match header against ETag

    If the request's If-None-Match header equals the ETag '12345', the server responds with status 304 and no body.
  2. Step 2: Understand 304 response meaning

    304 means Not Modified, telling the client to use cached data without sending the body again.
  3. Final Answer:

    A 304 Not Modified status with no body -> Option B
  4. Quick Check:

    If-None-Match matches ETag = 304 response [OK]
Hint: If ETag matches If-None-Match, send 304 no body [OK]
Common Mistakes:
  • Sending JSON body with 304 status
  • Confusing 304 with 404 or 500 errors
  • Ignoring If-None-Match header
4. Identify the bug in this Express code that tries to set Cache-Control and ETag headers:
app.get('/resource', (req, res) => {
  const content = 'data';
  res.setHeader('Cache-Control', 'max-age=600');
  res.set('ETag', 'abc123');
  res.send(content);
});
medium
A. Using both res.setHeader and res.set causes header conflicts
B. ETag header value must be a number, not a string
C. Cache-Control max-age should be in milliseconds, not seconds
D. No bug; code sets headers correctly

Solution

  1. Step 1: Check header setting methods

    In Express, res.setHeader and res.set both set headers correctly; using both is allowed and does not conflict.
  2. Step 2: Validate header values

    ETag can be any string value. Cache-Control max-age is in seconds, so '600' is valid for 10 minutes.
  3. Final Answer:

    No bug; code sets headers correctly -> Option D
  4. Quick Check:

    res.setHeader and res.set both valid; ETag string OK [OK]
Hint: res.set and res.setHeader both valid for headers [OK]
Common Mistakes:
  • Thinking ETag must be numeric
  • Confusing max-age units (seconds vs milliseconds)
  • Assuming res.setHeader and res.set conflict
5. You want to implement HTTP caching in Express so that clients cache a JSON response for 5 minutes, but also use ETag to validate changes. Which code snippet correctly combines Cache-Control and ETag headers to achieve this?
hard
A. res.set({ 'Cache-Control': 'max-age=300', ETag: 'xyz789' }); res.json(data);
B. res.set('Cache-Control', 'no-store'); res.set('ETag', 'xyz789'); res.json(data);
C. res.set('Cache-Control', 'max-age=300'); res.removeHeader('ETag'); res.json(data);
D. res.set('Cache-Control', 'max-age=300, no-cache'); res.set('ETag', 'xyz789'); res.json(data);

Solution

  1. Step 1: Set Cache-Control for 5 minutes

    5 minutes = 300 seconds, so max-age=300 is correct to allow caching for that duration.
  2. Step 2: Include ETag header for validation

    Setting ETag allows clients to check if the cached version is still valid before using it.
  3. Step 3: Analyze other options

    res.set('Cache-Control', 'no-store'); res.set('ETag', 'xyz789'); res.json(data); disables caching with 'no-store'. res.set('Cache-Control', 'max-age=300'); res.removeHeader('ETag'); res.json(data); removes ETag, losing validation. res.set('Cache-Control', 'max-age=300, no-cache'); res.set('ETag', 'xyz789'); res.json(data); uses conflicting directives 'max-age=300, no-cache' which disables caching despite max-age.
  4. Final Answer:

    res.set({ 'Cache-Control': 'max-age=300', ETag: 'xyz789' }); res.json(data); -> Option A
  5. Quick Check:

    Cache-Control max-age + ETag = proper caching [OK]
Hint: Combine max-age with ETag for caching plus validation [OK]
Common Mistakes:
  • Using no-store disables caching
  • Removing ETag loses validation benefits
  • Combining max-age with no-cache cancels caching
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