Discover how NestJS scopes save you from tricky bugs and messy code by managing service lifetimes for you!
Why Provider scope (default, request, transient) in NestJS? - Purpose & Use Cases
Imagine building a web app where you manually create and manage service instances for every user request, trying to keep track of which instance belongs to whom.
Manually managing service lifetimes is confusing and error-prone. You might accidentally share data between users or create too many instances, wasting memory and causing bugs.
NestJS provider scopes let the framework handle instance lifetimes automatically: default (single shared), request (one per request), and transient (new every time). This keeps your app safe and efficient.
const service = new Service(); // shared const service = new Service(); // manual new instance per request
@Injectable({ scope: Scope.REQUEST })
export class Service {}You can easily control how and when service instances are created, ensuring data isolation and optimal resource use without extra code.
In a chat app, request-scoped services keep each user's messages separate during a request, preventing data leaks and mix-ups.
Manual instance management is complex and risky.
Provider scopes automate instance lifetimes safely.
Default, request, and transient scopes fit different needs.
Practice
Solution
Step 1: Understand default provider scope behavior
By default, NestJS creates one instance of a provider and shares it across the whole app.Step 2: Compare with other scopes
Request scope creates per HTTP request instances, transient creates per injection instances, so default is the shared singleton.Final Answer:
A single instance is shared across the entire application. -> Option BQuick Check:
Default scope = singleton instance [OK]
- Confusing default with request scope
- Thinking default creates new instances per injection
- Assuming default destroys instance after use
Solution
Step 1: Recall correct syntax for setting scope
In NestJS, the scope is set using the Scope enum inside @Injectable decorator like { scope: Scope.TRANSIENT }.Step 2: Eliminate incorrect options
@Injectable({ scope: Scope.REQUEST }) uses REQUEST scope, @Injectable({ scope: 'transient' }) uses string instead of enum, @Injectable({ transient: true }) uses invalid property.Final Answer:
@Injectable({ scope: Scope.TRANSIENT }) -> Option CQuick Check:
Use Scope.TRANSIENT enum for transient scope [OK]
- Using string 'transient' instead of Scope enum
- Confusing transient with request scope
- Using invalid decorator properties
@Injectable({ scope: Scope.TRANSIENT })
export class MyService {
id = Math.random();
}
If this service is injected twice in the same controller, what will be true about the id values?Solution
Step 1: Understand transient scope behavior
Transient scope creates a new instance every time the service is injected, so each injection gets a fresh object.Step 2: Apply to the
Sinceidpropertyidis set to a random number on instance creation, each injection will have a differentid.Final Answer:
Each injection has a differentidvalue. -> Option DQuick Check:
Transient scope = new instance per injection [OK]
- Assuming transient shares instance like default
- Thinking id is constant or zero
- Expecting errors on multiple injections
Solution
Step 1: Understand request scope requirements
Request scope creates a new instance per HTTP request, so it only works if the provider is injected in a context handling requests.Step 2: Analyze the controller context
If the controller is not handling HTTP requests (e.g., injected in a service or singleton), the request scope behaves like singleton.Final Answer:
The controller injecting the service is not handling HTTP requests. -> Option AQuick Check:
Request scope needs HTTP request context [OK]
- Forgetting request scope needs HTTP context
- Confusing decorator absence with scope behavior
- Assuming string scope works like enum
Solution
Step 1: Understand request scope lifetime
Request-scoped services create one instance per HTTP request regardless of how many times they are injected.Step 2: Analyze injection chain
Even if injected into a transient service (new instance per injection), the request-scoped service instance remains the same within the same HTTP request.Final Answer:
One instance per HTTP request. -> Option AQuick Check:
Request scope = one instance per HTTP request [OK]
- Thinking transient causes multiple request-scoped instances
- Confusing transient and request scope lifetimes
- Assuming controller scope affects request-scoped service count
Ready to prove it?
Pass the test and this pattern moves unknown
