The Module System
Modules group related controllers and providers into cohesive, reusable units.
Syntax
@Module({ controllers, providers, imports, exports })A module is a class annotated with @Module() that groups a slice of your application. Every Nest app has at least one module, the root AppModule.
The @Module metadata
controllers- controllers to instantiate in this module.providers- providers available for injection within this module.imports- other modules whose exports this module needs.exports- providers this module makes available to importers.
Example
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}When to use it
- A developer splits a monolithic AppModule into UsersModule, OrdersModule, and PaymentsModule so each team owns its bounded context.
- A team uses the @Global() decorator on a CoreModule so its providers are available everywhere without repeated imports.
- An architect treats each NestJS module as a DDD aggregate boundary, ensuring no provider leaks outside its declared exports.
More examples
@Module decorator basics
Shows all four @Module metadata keys — imports, controllers, providers, and exports — in a single annotated example.
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
imports: [], // other modules this one needs
controllers: [UsersController],
providers: [UsersService],
exports: [UsersService], // what others can use
})
export class UsersModule {}Global module
Marks a module as @Global so its exports are available application-wide without each feature module importing it.
import { Global, Module } from '@nestjs/common';
import { ConfigService } from './config.service';
@Global() // providers available everywhere without importing this module
@Module({
providers: [ConfigService],
exports: [ConfigService],
})
export class ConfigModule {}Root module importing features
Illustrates the root AppModule composing the application by importing all feature modules.
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
import { OrdersModule } from './orders/orders.module';
@Module({
imports: [UsersModule, OrdersModule],
})
export class AppModule {}
Discussion