Global and Dynamic Modules

@Global Modules

Some providers are needed everywhere (config, logger, database). Mark their module with @Global() and import it once in AppModule. Use this sparingly; explicit imports are easier to follow.

src/common/common.module.ts

import { Global, Module } from '@nestjs/common';
import { AppLogger } from './app-logger.service';

@Global()
@Module({
  providers: [AppLogger],
  exports: [AppLogger],
})
export class CommonModule {}

Dynamic Modules (forRoot / register)

A dynamic module is configured when imported. You already use them: ConfigModule.forRoot(), TypeOrmModule.forRoot(), JwtModule.register().

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { JwtModule } from '@nestjs/jwt';

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),                     // global config
    JwtModule.register({ secret: 'dev-secret', signOptions: { expiresIn: '15m' } }),
  ],
})
export class AppModule {}

Tip: Convention: forRoot() configures a module once for the whole app; forFeature() adds per-module settings (for example which entities a module uses); register() configures it for one importing module.