Bird
Raised Fist0
Expressframework~5 mins

Repository pattern for data access in Express - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the Repository pattern in data access?
It is a way to organize code so that data access logic is separated from business logic. It acts like a middleman between the app and the database, making code easier to manage and test.
Click to reveal answer
beginner
Why use the Repository pattern in an Express app?
It helps keep your routes and controllers clean by moving database queries to a separate place. This makes your app easier to read, maintain, and change later without breaking other parts.
Click to reveal answer
intermediate
How does the Repository pattern improve testing?
Since data access is in one place, you can easily replace it with fake data or mocks during tests. This means you can test your app logic without needing a real database.
Click to reveal answer
beginner
In Express, what does a typical Repository file contain?
It usually has functions like find, create, update, and delete that talk to the database. These functions are called by controllers to get or change data.
Click to reveal answer
intermediate
What is a benefit of changing the database technology when using the Repository pattern?
You only need to update the repository code, not the whole app. This makes switching databases easier and safer.
Click to reveal answer
What role does the Repository pattern play in an Express app?
ASeparates data access from business logic
BHandles user authentication
CManages server configuration
DRenders HTML views
Which function would you expect in a Repository file?
ArenderView()
BhandleRequest()
CfindUser()
DstartServer()
How does the Repository pattern help with testing?
ABy making the UI prettier
BBy encrypting data
CBy speeding up server startup
DBy allowing database code to be mocked easily
If you switch from MongoDB to MySQL, what part of the app changes with the Repository pattern?
AOnly the repository code
BAll route handlers
CAll frontend code
DServer configuration only
Which is NOT a benefit of using the Repository pattern?
ACleaner code organization
BFaster HTTP response times
CEasier database switching
DSimpler testing
Explain how the Repository pattern separates concerns in an Express app.
Think about who talks to the database and who handles app logic.
You got /4 concepts.
    Describe how using the Repository pattern makes testing easier.
    Consider how you avoid using the real database in tests.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using the Repository pattern in an Express app?
      easy
      A. To manage user authentication
      B. To handle HTTP requests and responses
      C. To style the frontend components
      D. To separate data access logic from business logic

      Solution

      1. Step 1: Understand the role of repository pattern

        The repository pattern is designed to isolate data access logic from the rest of the application.
      2. Step 2: Identify the correct purpose in Express context

        In Express apps, it helps keep business logic clean by moving database queries into repositories.
      3. Final Answer:

        To separate data access logic from business logic -> Option D
      4. Quick Check:

        Repository pattern = separate data access [OK]
      Hint: Repository pattern means separate data access from app logic [OK]
      Common Mistakes:
      • Confusing repository with routing or middleware
      • Thinking it handles UI or styling
      • Mixing it with authentication logic
      2. Which of the following is the correct way to define a repository class in Express using ES6 syntax?
      easy
      A. class UserRepository { getAll() { /* code */ } }
      B. var UserRepository = new Object({ getAll: function() {} })
      C. const UserRepository = () => { return { getAll() {} } }
      D. function UserRepository() { this.getAll = () => {}; }

      Solution

      1. Step 1: Identify ES6 class syntax

        ES6 classes use the class keyword with methods inside without the function keyword.
      2. Step 2: Match the correct syntax

        class UserRepository { getAll() { /* code */ } } correctly defines a class with a method getAll() using ES6 syntax.
      3. Final Answer:

        class UserRepository { getAll() { /* code */ } } -> Option A
      4. Quick Check:

        ES6 class syntax = class UserRepository { getAll() { /* code */ } } [OK]
      Hint: ES6 classes use 'class' keyword and method shorthand [OK]
      Common Mistakes:
      • Using function keyword inside class methods
      • Confusing arrow functions with class methods
      • Using old object syntax instead of class
      3. Given this repository method, what will console.log(users) output?
      class UserRepository {
        constructor() {
          this.users = [{id:1, name:'Anna'}, {id:2, name:'Bob'}];
        }
        getAll() {
          return this.users;
        }
      }
      const repo = new UserRepository();
      const users = repo.getAll();
      console.log(users);
      medium
      A. [{id:1, name:'Anna'}, {id:2, name:'Bob'}]
      B. undefined
      C. Error: getAll is not a function
      D. []

      Solution

      1. Step 1: Understand the constructor initialization

        The constructor sets this.users to an array of two user objects.
      2. Step 2: Check the getAll method return value

        The getAll() method returns this.users, so calling it returns the array.
      3. Final Answer:

        [{id:1, name:'Anna'}, {id:2, name:'Bob'}] -> Option A
      4. Quick Check:

        getAll returns users array [OK]
      Hint: getAll returns stored users array directly [OK]
      Common Mistakes:
      • Assuming getAll returns undefined or empty
      • Confusing method call with property access
      • Expecting an error due to missing binding
      4. Identify the error in this repository code snippet:
      class ProductRepository {
        constructor() {
          this.products = [];
        }
        add(product) {
          this.products.push(product);
        }
        getAll() {
          return products;
        }
      }
      medium
      A. Missing return statement in getAll method
      B. Using undefined variable 'products' instead of 'this.products'
      C. Constructor does not initialize products array
      D. add method does not push product correctly

      Solution

      1. Step 1: Check variable usage in getAll method

        The method returns products but this variable is not defined in the method scope.
      2. Step 2: Correct usage of instance variable

        It should return this.products to access the class property.
      3. Final Answer:

        Using undefined variable 'products' instead of 'this.products' -> Option B
      4. Quick Check:

        Use this.products to access class property [OK]
      Hint: Use 'this.' to access class properties inside methods [OK]
      Common Mistakes:
      • Forgetting 'this.' prefix for class properties
      • Assuming variables are global inside class methods
      • Ignoring constructor initialization
      5. You want to extend a base repository to add a custom method findByEmail(email) for users. Which approach correctly implements this in Express?
      hard
      A. const UserRepository = Object.create(BaseRepository); UserRepository.findByEmail = function(email) { return this.data.find(u => u.email === email); };
      B. function UserRepository() { this.findByEmail = (email) => this.data.find(u => u.email === email); } UserRepository.prototype = BaseRepository.prototype;
      C. class UserRepository extends BaseRepository { findByEmail(email) { return this.data.find(u => u.email === email); } }
      D. class UserRepository { findByEmail(email) { return BaseRepository.data.find(u => u.email === email); } }

      Solution

      1. Step 1: Understand class inheritance in ES6

        Extending a base class uses extends keyword and super() if constructor is needed.
      2. Step 2: Check method implementation accessing instance data

        class UserRepository extends BaseRepository { findByEmail(email) { return this.data.find(u => u.email === email); } } correctly extends BaseRepository and uses this.data to find user by email.
      3. Final Answer:

        class UserRepository extends BaseRepository { findByEmail(email) { return this.data.find(u => u.email === email); } } -> Option C
      4. Quick Check:

        Extend base class and add method using this.data [OK]
      Hint: Use 'extends' to inherit and add custom methods in subclass [OK]
      Common Mistakes:
      • Not using 'extends' for inheritance
      • Accessing base class data incorrectly
      • Overwriting prototype without proper inheritance
      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