Bird
Raised Fist0
Expressframework~20 mins

Resource-based URL design in Express - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Resourceful Router
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What is the output of this Express route handler?
Consider this Express route that handles a GET request for a resource by ID. What will the server respond with when a client requests /users/42?
Express
const express = require('express');
const app = express();

app.get('/users/:id', (req, res) => {
  res.send(`User ID is ${req.params.id}`);
});

// Assume server is listening
AUser ID is 42
BUser ID is :id
CUser ID is undefined
D404 Not Found
Attempts:
2 left
💡 Hint
Look at how Express uses :id in the route path and how req.params works.
📝 Syntax
intermediate
2:00remaining
Which option correctly defines a route to update a resource using PUT?
You want to create an Express route to update a book resource by its ID using the HTTP PUT method. Which code snippet correctly defines this route?
Aapp.delete('/books/:id', (req, res) => { res.send(`Update book ${req.params.id}`); });
Bapp.get('/books/:id', (req, res) => { res.send(`Update book ${req.params.id}`); });
Capp.post('/books/:id', (req, res) => { res.send(`Update book ${req.params.id}`); });
Dapp.put('/books/:id', (req, res) => { res.send(`Update book ${req.params.id}`); });
Attempts:
2 left
💡 Hint
Remember that PUT is the HTTP method used for updating resources.
🔧 Debug
advanced
2:30remaining
Why does this Express route not match requests as expected?
This Express app has two routes defined. Why will a GET request to /products/123 always respond with 'All products' instead of the product ID?
Express
const express = require('express');
const app = express();

app.get('/products*', (req, res) => {
  res.send('All products');
});

app.get('/products/:id', (req, res) => {
  res.send(`Product ID: ${req.params.id}`);
});
AThe server is missing middleware to parse URL parameters.
BExpress does not support route parameters with colons.
CThe order of routes matters; the first route matches '/products' and also '/products/123' because of missing strict matching.
DThe second route has a syntax error and never registers.
Attempts:
2 left
💡 Hint
Think about how Express matches routes in the order they are defined.
state_output
advanced
2:00remaining
What is the response when sending a DELETE request to this route?
Given this Express route, what will the client receive when making a DELETE request to /orders/99?
Express
const express = require('express');
const app = express();

app.delete('/orders/:orderId', (req, res) => {
  const id = req.params.orderId;
  res.status(200).json({ message: `Order ${id} deleted` });
});
AOrder 99 deleted
B{"message":"Order 99 deleted"}
C{"error":"Order not found"}
D404 Not Found
Attempts:
2 left
💡 Hint
Look at the response method and status code used.
🧠 Conceptual
expert
2:30remaining
Which URL best follows resource-based URL design principles for accessing comments of a blog post?
You have a blog post resource and each post can have multiple comments. According to resource-based URL design, which URL is the best choice to get all comments for a post with ID 7?
A/posts/7/comments
B/comments?postId=7
C/getCommentsForPost/7
D/posts/comments/7
Attempts:
2 left
💡 Hint
Resource-based URLs use nouns and hierarchical structure to represent relationships.

Practice

(1/5)
1. What is the main idea behind resource-based URL design in Express?
easy
A. Combine all actions into one URL
B. Use random URLs for each action
C. Avoid using HTTP methods in URLs
D. Organize URLs around data items like users or books

Solution

  1. Step 1: Understand resource-based URL design

    This design organizes URLs by resources such as users or books, making them clear and meaningful.
  2. Step 2: Compare options

    Options B, C, and D do not follow this clear organization principle.
  3. Final Answer:

    Organize URLs around data items like users or books -> Option D
  4. Quick Check:

    Resource-based URLs = Organize by data items [OK]
Hint: Think: URLs should name data items clearly [OK]
Common Mistakes:
  • Thinking URLs should be random or unclear
  • Ignoring HTTP methods in design
  • Putting all actions under one URL
2. Which Express route correctly follows resource-based URL design to get a user by ID?
easy
A. app.get('/user/:id', handler)
B. app.get('/getUser', handler)
C. app.post('/user/:id', handler)
D. app.delete('/user', handler)

Solution

  1. Step 1: Identify correct HTTP method and URL pattern

    To get a user by ID, use GET method and URL with resource and ID: '/user/:id'.
  2. Step 2: Check options

    app.get('/user/:id', handler) uses GET and '/user/:id' which is correct. Others use wrong methods or URLs.
  3. Final Answer:

    app.get('/user/:id', handler) -> Option A
  4. Quick Check:

    GET + /resource/:id = correct get route [OK]
Hint: GET method + resource path with :id for fetching [OK]
Common Mistakes:
  • Using POST instead of GET for fetching
  • Using generic paths like '/getUser'
  • Missing :id parameter in URL
3. What will be the response if the following Express route is called with DELETE /books/123?
app.delete('/books/:bookId', (req, res) => {
  res.send(`Deleted book ${req.params.bookId}`);
});
medium
A. 404 Not Found error
B. "Deleted book :bookId"
C. "Deleted book 123"
D. SyntaxError

Solution

  1. Step 1: Understand route and HTTP method

    The route listens for DELETE requests on '/books/:bookId'. The parameter bookId will be '123' from the URL.
  2. Step 2: Check response behavior

    The handler sends a string with the bookId inserted, so response is 'Deleted book 123'.
  3. Final Answer:

    "Deleted book 123" -> Option C
  4. Quick Check:

    DELETE /books/:id returns message with id [OK]
Hint: Route param replaces :bookId in response [OK]
Common Mistakes:
  • Confusing parameter name with literal string
  • Expecting 404 if route exists
  • Thinking syntax error occurs
4. Identify the error in this Express route for updating a user:
app.put('/users', (req, res) => {
  const id = req.params.id;
  res.send(`Updated user ${id}`);
});
medium
A. req.params.id should be req.body.id
B. Missing :id parameter in URL path
C. res.send should be res.json
D. Using PUT instead of POST

Solution

  1. Step 1: Check URL path and parameter usage

    The route URL is '/users' but code tries to read req.params.id which requires ':id' in path.
  2. Step 2: Identify mismatch

    Since ':id' is missing in URL, req.params.id will be undefined causing error or wrong behavior.
  3. Final Answer:

    Missing :id parameter in URL path -> Option B
  4. Quick Check:

    URL must include :id to access req.params.id [OK]
Hint: Check if URL path matches params used in code [OK]
Common Mistakes:
  • Ignoring missing :id in URL
  • Confusing req.params with req.body
  • Thinking PUT is wrong method here
5. You want to design Express routes for a blog API with posts and comments. Which URL design best follows resource-based principles for updating a comment with ID 45 on post with ID 10?
hard
A. app.put('/posts/10/comments/45', handler)
B. app.put('/updateComment', handler)
C. app.put('/comments/45', handler)
D. app.put('/posts/comments', handler)

Solution

  1. Step 1: Understand nested resource URLs

    Comments belong to posts, so URL should reflect this hierarchy: '/posts/:postId/comments/:commentId'.
  2. Step 2: Check options for correct pattern

    app.put('/posts/10/comments/45', handler) uses full nested path with IDs, matching resource-based design. Others miss nesting or IDs.
  3. Final Answer:

    app.put('/posts/10/comments/45', handler) -> Option A
  4. Quick Check:

    Nested resource URLs = /posts/:postId/comments/:commentId [OK]
Hint: Nest related resources in URL with IDs [OK]
Common Mistakes:
  • Using generic action names in URL
  • Omitting parent resource ID
  • Ignoring resource hierarchy