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.

Module composition tree: AppModule imports feature modules which import shared modulesAppModuleUsersModuleAuthModuleOrdersModuleDatabaseModule(shared)
The root module wires feature modules together; a shared module exports providers many features reuse.

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

Example · typescript
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.

Example · ts
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.

Example · ts
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.

Example · ts
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

  • Be the first to comment on this lesson.