Skip to main content
Practice Problems

What are modules in NestJS and how do they work?

NestJS Modules

A Module is the fundamental building block of a NestJS application. Every NestJS app has at least one module β€” the root module (AppModule). Modules help organize your application into cohesive blocks of functionality.


The @Module() Decorator

typescript
import { Module } from '@nestjs/common'; @Module({ imports: [], // other modules to import controllers: [], // controllers defined in this module providers: [], // services/providers defined in this module exports: [], // providers to expose to other modules }) export class UsersModule {}
PropertyDescription
importsModules whose exported providers are needed here
controllersControllers that belong to this module
providersServices, repositories, factories, etc.
exportsSubset of providers available to importing modules

Feature Module Example

typescript
// users/users.module.ts import { Module } from '@nestjs/common'; import { UsersController } from './users.controller'; import { UsersService } from './users.service'; @Module({ controllers: [UsersController], providers: [UsersService], exports: [UsersService], // make UsersService available to other modules }) export class UsersModule {} // app.module.ts (root module) import { Module } from '@nestjs/common'; import { UsersModule } from './users/users.module'; import { PostsModule } from './posts/posts.module'; @Module({ imports: [UsersModule, PostsModule], }) export class AppModule {}

Module Types

Feature Module

Groups related controllers and services for one domain:

typescript
@Module({ imports: [TypeOrmModule.forFeature([User])], controllers: [UsersController], providers: [UsersService], exports: [UsersService], }) export class UsersModule {}

Shared Module

Provides common services across the app by exporting them:

typescript
@Module({ providers: [EmailService, LoggerService], exports: [EmailService, LoggerService], }) export class SharedModule {}

Global Module

Available in every module without importing:

typescript
import { Global, Module } from '@nestjs/common'; @Global() @Module({ providers: [ConfigService], exports: [ConfigService], }) export class ConfigModule {}

Dynamic Module

Configured at import time (useful for libraries):

typescript
@Module({}) export class DatabaseModule { static forRoot(options: DatabaseOptions): DynamicModule { return { module: DatabaseModule, providers: [ { provide: 'DATABASE_OPTIONS', useValue: options }, DatabaseService, ], exports: [DatabaseService], global: true, }; } } // Usage: @Module({ imports: [DatabaseModule.forRoot({ host: 'localhost' })], }) export class AppModule {}

src/ β”œβ”€β”€ app.module.ts β”œβ”€β”€ main.ts β”œβ”€β”€ users/ β”‚ β”œβ”€β”€ users.module.ts β”‚ β”œβ”€β”€ users.controller.ts β”‚ β”œβ”€β”€ users.service.ts β”‚ β”œβ”€β”€ users.repository.ts β”‚ β”œβ”€β”€ dto/ β”‚ β”‚ β”œβ”€β”€ create-user.dto.ts β”‚ β”‚ └── update-user.dto.ts β”‚ └── entities/ β”‚ └── user.entity.ts └── shared/ β”œβ”€β”€ shared.module.ts └── services/ └── email.service.ts

Summary

Modules in NestJS are namespaces that encapsulate a feature area. Use feature modules to keep code organized, shared modules for reusable services, global modules for app-wide providers, and dynamic modules for configurable libraries. Every provider must belong to a module before it can be used.

Short Answer

Interview ready
Premium

A concise answer to help you respond confidently on this topic during an interview.

Finished reading?
Practice Problems