📖 Scenario: You are building a simple NestJS application that organizes features into modules. Modules help group related controllers and providers together.
🎯 Goal: Create a NestJS module using the @Module decorator. Add controllers and providers metadata to the module to organize your app structure.
📋 What You'll Learn
Create a module class named AppModule
Use the @Module decorator on AppModule
Add a controller named AppController to the module metadata
Add a provider named AppService to the module metadata
💡 Why This Matters
🌍 Real World
Modules in NestJS help organize code by grouping related controllers and services, making large apps easier to manage.
💼 Career
Understanding module decorators and metadata is essential for building scalable backend applications with NestJS, a popular Node.js framework.
Progress0 / 4 steps
1
Create the AppModule class
Create an empty class named AppModule in your file.
NestJS
Hint
Use the class keyword followed by AppModule and empty curly braces.
2
Import Module decorator and add it to AppModule
Import Module from @nestjs/common and add the @Module decorator above the AppModule class.
NestJS
Hint
Use @Module({}) just before the class declaration.
3
Add controllers metadata with AppController
Inside the @Module decorator, add a controllers array with AppController as its only element.
NestJS
Hint
Write controllers: [AppController] inside the decorator object.
4
Add providers metadata with AppService
Add a providers array inside the @Module decorator with AppService as its only element.
NestJS
Hint
Add providers: [AppService] inside the decorator object after controllers.
Practice
(1/5)
1. What is the main purpose of the @Module decorator in NestJS?
easy
A. To define the database connection settings
B. To group related components like controllers and providers together
C. To create HTTP routes directly
D. To style the application UI
Solution
Step 1: Understand the role of @Module
The @Module decorator organizes related parts of the app such as controllers and providers.
Step 2: Compare options
The options describing database connections, HTTP routing, or UI styling are unrelated to the main role of @Module.
Final Answer:
To group related components like controllers and providers together -> Option B
Quick Check:
@Module groups controllers & providers [OK]
Hint: Remember: @Module bundles controllers and providers [OK]
Common Mistakes:
Thinking @Module sets up database connections
Confusing @Module with routing decorators
Assuming @Module styles the UI
2. Which of the following is the correct way to define a NestJS module with a controller named AppController and a provider named AppService?
easy
A. @Module({ controller: [AppController], provider: [AppService] })
B. @Module({ controllers: AppController, providers: AppService })
C. @Module({ controllers: (AppController), providers: (AppService) })
D. @Module({ controllers: [AppController], providers: [AppService] })
Solution
Step 1: Check correct property names and syntax
The @Module decorator expects arrays for controllers and providers properties.
Step 2: Validate each option
Singular property names like 'controller'/'provider', missing array brackets, or parentheses instead of square brackets are incorrect. The correct syntax uses plural 'controllers'/'providers' with arrays.
Final Answer:
@Module({ controllers: [AppController], providers: [AppService] }) -> Option D
Quick Check:
controllers & providers must be arrays [OK]
Hint: Use arrays for controllers and providers in @Module [OK]
Common Mistakes:
Using singular property names like controller or provider
Not wrapping controllers/providers in arrays
Using parentheses instead of square brackets
3. Given the following module definition, what will be the value of AppModule.imports.length?
A. imports should be an array, not a single module
B. controllers should not be inside an array
C. providers property is missing
D. Module class must have a constructor
Solution
Step 1: Check the imports property type
The imports property must be an array, but here it is a single module without brackets.
Step 2: Verify other properties
controllers and providers are correctly arrays. The module class does not require a constructor by default.
Final Answer:
imports should be an array, not a single module -> Option A
Quick Check:
imports must be array [OK]
Hint: Always wrap imports in square brackets [OK]
Common Mistakes:
Using single module without array in imports
Thinking controllers can't be arrays
Assuming constructor is mandatory
5. You want to share a service SharedService from SharedModule so other modules can use it. Which is the correct way to configure SharedModule to allow this?
hard
A. @Module({ imports: [SharedService], exports: [SharedService] })
B. @Module({ providers: [SharedService] })
C. @Module({ providers: [SharedService], exports: [SharedService] })
D. @Module({ exports: [SharedService] })
Solution
Step 1: Understand sharing services via exports
To share a service, it must be both provided and exported in the module metadata.
Step 2: Analyze options
Sharing requires listing the service in both providers (to provide it) and exports (to make it available to importers). imports is for modules, not services. Missing either providers or exports prevents sharing.
Final Answer:
@Module({ providers: [SharedService], exports: [SharedService] }) -> Option C
Quick Check:
providers AND exports needed [OK]
Hint: Provide and export service to share it with other modules [OK]
Common Mistakes:
Forgetting to export the service
Trying to import a service instead of providing it
Only exporting without providing the service
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.