Bird
Raised Fist0
NestJSframework~20 mins

Why providers encapsulate business logic in NestJS - Challenge Your Understanding

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
NestJS Provider Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
2:00remaining
Why do providers in NestJS encapsulate business logic?

In NestJS, providers are used to hold business logic. Why is this separation important?

AIt forces all logic to be written inside controllers, making the app faster.
BIt keeps the code organized and makes it easier to test business rules separately from controllers.
CIt allows the database to directly call the business logic without any code in between.
DIt makes the user interface handle all the data processing to reduce server load.
Attempts:
2 left
💡 Hint

Think about how separating concerns helps in managing code complexity and testing.

❓ component_behavior
intermediate
2:00remaining
What happens if you put business logic directly in a NestJS controller?

Consider a NestJS controller that contains complex business logic instead of delegating it to a provider. What is the likely outcome?

ANestJS will throw a runtime error because business logic is not allowed in controllers.
BThe application will run faster because logic is closer to the request.
CThe controller becomes harder to maintain and test because it mixes request handling with business rules.
DThe provider will automatically inherit the logic from the controller.
Attempts:
2 left
💡 Hint

Think about code clarity and testing when logic is mixed in one place.

❓ lifecycle
advanced
2:00remaining
How does encapsulating business logic in providers affect dependency injection in NestJS?

When business logic is inside providers, how does this influence the way NestJS manages dependencies?

AProviders can be injected into controllers or other providers, allowing easy reuse and testing of business logic.
BProviders cannot be injected anywhere, so logic must be duplicated in each controller.
CDependency injection only works with controllers, not providers.
DEncapsulating logic in providers disables NestJS's dependency injection system.
Attempts:
2 left
💡 Hint

Consider how NestJS uses providers to share logic across the app.

📝 Syntax
advanced
2:00remaining
Which provider code correctly encapsulates business logic in NestJS?

Choose the provider code snippet that properly encapsulates a simple business rule to calculate a discount.

NestJS
export class DiscountService {
  calculate(price: number): number {
    if (price > 100) {
      return price * 0.9;
    }
    return price;
  }
}
A
export class DiscountService {
  calculate(price: number) {
    if price > 100 {
      return price * 0.9
    }
    return price
  }
}
B
export class DiscountService {
  calculate(price: number): number {
    if (price > 100) {
      return price * 0.9;
    }
  }
}
C
export class DiscountService {
  calculate(price: number): number {
    if (price > 100) {
      price = price * 0.9
    }
  }
}
D
export class DiscountService {
  calculate(price: number): number {
    if (price > 100) {
      return price * 0.9;
    }
    return price;
  }
}
Attempts:
2 left
💡 Hint

Look for correct TypeScript syntax and a method that always returns a number.

🔧 Debug
expert
2:00remaining
Why does this NestJS provider fail to inject properly?

Given this provider code, why does NestJS throw an error when trying to inject it into a controller?

NestJS
import { Injectable } from '@nestjs/common';

@Injectable()
export class UserService {
  getUser() {
    return { id: 1, name: 'Alice' };
  }
}
AThe @Injectable() decorator is missing, so NestJS cannot recognize it as a provider.
BThe getUser method is missing a return type annotation, causing injection failure.
CThe class name UserService is reserved and cannot be used as a provider.
DThe import statement for Injectable is incorrect and causes a syntax error.
Attempts:
2 left
💡 Hint

Check if the class is properly marked for NestJS dependency injection.

Practice

(1/5)
1. Why do NestJS providers encapsulate business logic instead of placing it directly in controllers?
easy
A. To make the app run faster
B. Because controllers cannot contain any code
C. To keep the code organized and separate concerns
D. Because providers handle user interface rendering

Solution

  1. Step 1: Understand roles of controllers and providers

    Controllers handle requests and responses, while providers hold the main business rules and logic.
  2. Step 2: Recognize separation of concerns

    Separating logic into providers keeps code organized, easier to test, and reusable.
  3. Final Answer:

    To keep the code organized and separate concerns -> Option C
  4. Quick Check:

    Separation of concerns = A [OK]
Hint: Remember: providers = logic, controllers = routes [OK]
Common Mistakes:
  • Thinking controllers should hold business logic
  • Believing providers speed up app performance
  • Confusing providers with UI rendering
2. Which of the following is the correct way to define a provider class in NestJS that encapsulates business logic?
easy
A. @Injectable() export class MyService { doTask() { return 'done'; } }
B. export class MyService { constructor() {} }
C. function MyService() { return 'done'; }
D. const MyService = () => 'done';

Solution

  1. Step 1: Identify NestJS provider syntax

    Providers must be decorated with @Injectable() to be recognized by NestJS.
  2. Step 2: Check class structure

    @Injectable() export class MyService { doTask() { return 'done'; } } shows a class with @Injectable() and a method, which is correct for a provider.
  3. Final Answer:

    @Injectable() export class MyService { doTask() { return 'done'; } } -> Option A
  4. Quick Check:

    @Injectable() + class = B [OK]
Hint: Look for @Injectable() decorator on classes [OK]
Common Mistakes:
  • Omitting @Injectable() decorator
  • Using plain functions instead of classes
  • Not exporting the provider class
3. Given this provider code, what will be the output when appService.getGreeting() is called?
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getGreeting() {
    return 'Hello from provider!';
  }
}
medium
A. 'Hello from provider!'
B. undefined
C. Error: Method not found
D. 'Hello from controller!'

Solution

  1. Step 1: Analyze the getGreeting method

    The method returns the string 'Hello from provider!'.
  2. Step 2: Understand method call result

    Calling appService.getGreeting() returns the exact string defined.
  3. Final Answer:

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

    Method returns string = A [OK]
Hint: Method returns string literal, expect exact output [OK]
Common Mistakes:
  • Confusing provider output with controller output
  • Expecting undefined if method is not async
  • Assuming error without checking method existence
4. Identify the error in this provider code snippet:
@Injectable()
export class UserService {
  getUser() {
    return this.user;
  }
}
medium
A. getUser method should be async
B. Missing declaration of 'user' property
C. Missing @Controller decorator
D. UserService should not be injectable

Solution

  1. Step 1: Check class properties

    The method getUser returns this.user, but 'user' is not declared anywhere in the class.
  2. Step 2: Understand consequences

    Accessing an undeclared property will cause runtime errors or undefined returns.
  3. Final Answer:

    Missing declaration of 'user' property -> Option B
  4. Quick Check:

    Undeclared property access = C [OK]
Hint: Check if all used properties are declared in the class [OK]
Common Mistakes:
  • Thinking @Controller is needed on providers
  • Assuming async needed without async code
  • Believing providers can't be injectable
5. You want to reuse business logic for calculating discounts in multiple controllers. What is the best way to organize this in NestJS?
hard
A. Put the discount calculation code inside each controller separately
B. Use a global variable to store discount values accessible by all controllers
C. Write the discount logic directly in the main.ts bootstrap file
D. Create a provider service with discount logic and inject it where needed

Solution

  1. Step 1: Identify code reuse best practice

    Duplicating logic in controllers causes maintenance issues and breaks separation of concerns.
  2. Step 2: Use providers for shared logic

    Creating a provider service encapsulates the discount logic and allows injection into any controller.
  3. Final Answer:

    Create a provider service with discount logic and inject it where needed -> Option D
  4. Quick Check:

    Shared logic in providers = D [OK]
Hint: Use providers to share logic across controllers [OK]
Common Mistakes:
  • Duplicating logic in controllers
  • Using global variables instead of providers
  • Placing logic in bootstrap file
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