Bird
Raised Fist0
Expressframework~20 mins

Controller pattern for route handlers in Express - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Express Controller Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What is the output when calling the Express route with the controller pattern?

Consider this Express route setup using a controller function:

const express = require('express');
const app = express();

const userController = {
  getUser: (req, res) => {
    res.send(`User ID is ${req.params.id}`);
  }
};

app.get('/user/:id', userController.getUser);

// Simulate a GET request to /user/42

What will the response body be?

Express
const express = require('express');
const app = express();

const userController = {
  getUser: (req, res) => {
    res.send(`User ID is ${req.params.id}`);
  }
};

app.get('/user/:id', userController.getUser);

// Simulate a GET request to /user/42
AUser ID is 42
BUser ID is undefined
CError: req.params is not defined
DUser ID is :id
Attempts:
2 left
💡 Hint

Think about how Express passes route parameters to the controller function.

📝 Syntax
intermediate
2:00remaining
Which option correctly exports a controller function for Express?

You want to create a controller file userController.js that exports a function getUser to handle requests.

Which code snippet correctly exports the function for use in Express routes?

Aexports.getUser() { res.send('Hello'); }
Bmodule.exports = { getUser: (req, res) => { res.send('Hello'); } };
Cexport getUser = (req, res) => { res.send('Hello'); };
Dmodule.exports.getUser = function(req, res) { res.send('Hello'); }
Attempts:
2 left
💡 Hint

Remember the Node.js module export syntax.

🔧 Debug
advanced
2:00remaining
Why does this controller function cause an error when used as a route handler?

Look at this controller code:

const userController = {
  getUser(req, res) {
    this.findUser(req.params.id).then(user => {
      res.json(user);
    });
  },
  findUser(id) {
    return Promise.resolve({ id, name: 'Alice' });
  }
};

app.get('/user/:id', userController.getUser);

When calling /user/1, it throws an error. Why?

Express
const userController = {
  getUser(req, res) {
    this.findUser(req.params.id).then(user => {
      res.json(user);
    });
  },
  findUser(id) {
    return Promise.resolve({ id, name: 'Alice' });
  }
};

app.get('/user/:id', userController.getUser);
AfindUser is not a function error because it is not defined
Bres.json is not a function error because res is undefined
CPromise is not defined error due to missing import
D'this' is undefined inside getUser when called by Express, causing a TypeError
Attempts:
2 left
💡 Hint

Think about how this behaves in JavaScript when a method is passed as a callback.

❓ state_output
advanced
2:00remaining
What is the output after calling this Express controller with async/await?

Given this controller function:

const userController = {
  async getUser(req, res) {
    const user = await this.findUser(req.params.id);
    res.json(user);
  },
  findUser(id) {
    return Promise.resolve({ id, name: 'Bob' });
  }
};

app.get('/user/:id', userController.getUser.bind(userController));

// Simulate GET /user/7

What will the response JSON be?

Express
const userController = {
  async getUser(req, res) {
    const user = await this.findUser(req.params.id);
    res.json(user);
  },
  findUser(id) {
    return Promise.resolve({ id, name: 'Bob' });
  }
};

app.get('/user/:id', userController.getUser.bind(userController));

// Simulate GET /user/7
A{"id":"7","name":"Bob"}
B{"id":7,"name":"Bob"}
C{"id":"req.params.id","name":"Bob"}
DError: Cannot read property 'findUser' of undefined
Attempts:
2 left
💡 Hint

Remember that route parameters are strings by default.

🧠 Conceptual
expert
2:00remaining
Which statement best explains the benefit of using the controller pattern in Express route handlers?

Why do developers use the controller pattern to organize route handlers in Express applications?

AIt forces all routes to be synchronous, preventing async bugs
BIt automatically improves server performance by caching responses
CIt separates route definitions from business logic, making code easier to maintain and test
DIt eliminates the need for middleware functions in Express
Attempts:
2 left
💡 Hint

Think about code organization and clarity.

Practice

(1/5)
1. What is the main purpose of using the controller pattern in Express route handlers?
easy
A. To separate route logic from routing setup for better organization
B. To combine all route handlers into a single file
C. To directly write SQL queries inside route handlers
D. To avoid using middleware functions in routes

Solution

  1. Step 1: Understand the controller pattern concept

    The controller pattern means moving the logic that handles requests out of the route definitions into separate functions or files.
  2. Step 2: Identify the benefit of separation

    This separation improves code organization, making it easier to read and maintain.
  3. Final Answer:

    To separate route logic from routing setup for better organization -> Option A
  4. Quick Check:

    Controller pattern = separation of concerns [OK]
Hint: Controllers keep route files clean and logic separate [OK]
Common Mistakes:
  • Thinking controllers combine all routes in one file
  • Believing controllers write database queries directly
  • Confusing controllers with middleware avoidance
2. Which of the following is the correct way to import and use a controller function named getUser in an Express route?
easy
A. router.get('/user', getUser());
B. router.get('/user', () => getUser);
C. router.get('/user', getUser => {});
D. router.get('/user', getUser);

Solution

  1. Step 1: Understand how to pass controller functions

    In Express, route handlers expect a function reference, not the result of calling the function.
  2. Step 2: Identify correct syntax

    Passing getUser without parentheses passes the function itself. Using parentheses calls it immediately, which is incorrect here.
  3. Final Answer:

    router.get('/user', getUser); -> Option D
  4. Quick Check:

    Pass function reference without () [OK]
Hint: Pass controller as function reference, no parentheses [OK]
Common Mistakes:
  • Calling the controller function immediately with ()
  • Using arrow functions incorrectly wrapping the controller
  • Returning the function instead of calling it
3. Given this controller function and route setup, what will be the response when a GET request is made to /hello?
const sayHello = (req, res) => {
  res.send('Hello from controller!');
};

router.get('/hello', sayHello);
medium
A. Hello from controller!
B. Error: sayHello is not a function
C. No response, request hangs
D. 404 Not Found

Solution

  1. Step 1: Analyze the controller function behavior

    The sayHello function sends a plain text response 'Hello from controller!' when called.
  2. Step 2: Check route setup correctness

    The route uses sayHello correctly as the handler for GET requests to '/hello'.
  3. Final Answer:

    Hello from controller! -> Option A
  4. Quick Check:

    Controller sends response text [OK]
Hint: Controller sends response, route calls it correctly [OK]
Common Mistakes:
  • Forgetting to call res.send inside controller
  • Passing controller incorrectly causing runtime error
  • Misreading route path causing 404
4. Identify the error in this Express controller pattern usage:
const userController = {
  getUser: (req, res) => {
    res.json({ name: 'Alice' });
  }
};

router.get('/user', userController.getUser());
medium
A. res.json should be res.send
B. Missing import statement for router
C. Calling userController.getUser() immediately instead of passing function
D. Route path should be '/users' not '/user'

Solution

  1. Step 1: Check how controller function is passed

    The code calls userController.getUser() immediately, which runs the function and passes its result, not the function itself.
  2. Step 2: Understand correct usage

    Express expects a function reference as the route handler, so it should be userController.getUser without parentheses.
  3. Final Answer:

    Calling userController.getUser() immediately instead of passing function -> Option C
  4. Quick Check:

    Pass function reference, not call it [OK]
Hint: Don't add () when passing controller to route [OK]
Common Mistakes:
  • Calling controller function instead of passing it
  • Confusing res.json and res.send (both valid here)
  • Assuming route path naming causes error
5. You want to organize your Express app using the controller pattern. You have multiple routes for users: getUser, createUser, and deleteUser. Which approach best follows the controller pattern for clean code?
hard
A. Put all route definitions and logic inside a single routes.js file without controllers
B. Define all user-related functions in a separate userController.js file and import them in the router file
C. Write all user route handlers directly inside the main app.js file
D. Use inline anonymous functions for each route in the router file

Solution

  1. Step 1: Understand controller pattern best practice

    Controllers group related route logic into separate files or modules to keep code organized and reusable.
  2. Step 2: Evaluate options for clean code

    Defining all user-related functions in a dedicated userController.js file and importing them into the router file follows the pattern well.
  3. Final Answer:

    Define all user-related functions in a separate userController.js file and import them in the router file -> Option B
  4. Quick Check:

    Separate logic into controller files [OK]
Hint: Group related handlers in controller files, import in routes [OK]
Common Mistakes:
  • Putting all logic in main app file making it messy
  • Mixing routes and logic in one file without separation
  • Using anonymous functions inline reduces reusability
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