Skip to content

NestContainer

reference
2 min readUpdated

Kind: Class

Source: packages/core/injector/container.ts

Part of: Core

NestContainer is NestJS’s internal registry for application modules, dynamic module metadata, global modules, and HTTP adapter references. During bootstrap, it compiles and stores modules so the injector and dependency-scanning pipeline can resolve providers, imports, and global dependencies.

Methods

MethodSignatureReturns
setHttpAdaptersetHttpAdapter(httpAdapter: any)void
getHttpAdapterRefgetHttpAdapterRef()void
getHttpAdapterHostRefgetHttpAdapterHostRef()void
addModuleaddModule(metatype: ModuleMetatype, scope: ModuleScope)`Promise<
replaceModulereplaceModule(metatypeToReplace: ModuleMetatype, newMetatype: ModuleMetatype, scope: ModuleScope)`Promise<
addDynamicMetadataaddDynamicMetadata(token: string, dynamicModuleMetadata: Partial<DynamicModule>, scope: Type<any>[])void
addDynamicModulesaddDynamicModules(modules: any[], scope: Type<any>[])void
isGlobalModuleisGlobalModule(metatype: Type<any>, dynamicMetadata: Partial<DynamicModule>)boolean
addGlobalModuleaddGlobalModule(module: Module)void
getModulesgetModules()ModulesContainer
getModuleCompilergetModuleCompiler()ModuleCompiler
getModuleByKeygetModuleByKey(moduleKey: string)`Module
getInternalCoreModuleRefgetInternalCoreModuleRef()`Module
addImport`addImport(relatedModule: TypeDynamicModule, token: string)`
addProvideraddProvider(provider: Provider, token: string, enhancerSubtype: EnhancerSubtype)`string
addInjectableaddInjectable(injectable: Provider, token: string, enhancerSubtype: EnhancerSubtype, host: Type<Injectable>)void
addExportedProviderOrModule`addExportedProviderOrModule(toExport: TypeDynamicModule, token: string)`
addControlleraddController(controller: Type<any>, token: string)void
clearclear()void
replace`replace(toReplace: any, options: { scope: any[]null })`
bindGlobalScopebindGlobalScope()void
bindGlobalsToImportsbindGlobalsToImports(moduleRef: Module)void
bindGlobalModuleToModulebindGlobalModuleToModule(target: Module, globalModule: Module)void
getDynamicMetadataByTokengetDynamicMetadataByToken(token: string)Partial<DynamicModule>
getDynamicMetadataByTokengetDynamicMetadataByToken(token: string, metadataKey: K)DynamicModule[K]
getDynamicMetadataByToken`getDynamicMetadataByToken(token: string, metadataKey: Exclude<keyof DynamicModule, 'global''module'>)`
registerCoreModuleRefregisterCoreModuleRef(moduleRef: Module)void
getModuleTokenFactorygetModuleTokenFactory()ModuleOpaqueKeyFactory
registerRequestProviderregisterRequestProvider(request: T, contextId: ContextId)void

Where it refuses work

  • NestContainer stops the work with UnknownModuleException when !this.modules.has(token), in 3 places.
  • NestContainer stops the work with UndefinedForwardRefException when !metatype.
  • NestContainer stops the work with UndefinedForwardRefException when !metatypeToReplace || !newMetatype.
  • NestContainer stops the work with CircularDependencyException when !provider.
  • NestContainer stops the work with UnknownModuleException when !moduleRef.
  • NestContainer stops the work with an early return when !this.internalProvidersStorage.httpAdapterHost.

Diagram

mermaid
graph LR
  Bootstrap[Nest application bootstrap] --> Container[NestContainer]
  Container --> Compiler[ModuleCompiler]
  Compiler --> Modules[ModulesContainer]
  Container --> DynamicMetadata[Dynamic module metadata]
  Container --> GlobalModules[Global module registry]
  Container --> Adapter[HTTP adapter reference]
  Modules --> Injector[Dependency injector]
  GlobalModules --> Injector

Usage

ts
import { NestContainer } from '@nestjs/core/injector/container';
import { ExpressAdapter } from '@nestjs/platform-express';

import { AppModule } from './app.module';

// NestContainer is typically created internally by NestFactory.
// This example demonstrates the underlying module registration flow.
async function registerApplicationModule() {
  const container = new NestContainer();

  container.setHttpAdapter(new ExpressAdapter());

  const result = await container.addModule(AppModule);

  if (result?.inserted) {
    console.log(`Registered module: ${result.moduleRef.metatype.name}`);
  }

  const modules = container.getModules();
  console.log(`Registered modules: ${modules.size}`);

  return container;
}

AI Coding Instructions

  • Treat NestContainer as framework infrastructure; application code should generally use NestFactory instead of constructing it directly.
  • Register modules through addModule() so module compilation, dynamic metadata handling, and token generation remain consistent.
  • Use replaceModule() only for controlled overrides, such as testing or platform-level module replacement.
  • When adding dynamic modules, preserve their metadata through addDynamicMetadata() and addDynamicModules() rather than mutating the module registry directly.
  • Mark and register global modules through the container flow so their exported providers are available across the application.

Relationships

  • IMPORTS → DynamicModule
  • IMPORTS → Provider
  • IMPORTS → EnhancerSubtype
  • IMPORTS → GLOBAL_MODULE_METADATA
  • IMPORTS → Injectable
  • IMPORTS → Type
  • IMPORTS → NestApplicationContextOptions

Used by

9 references from 9 files. Each is a place in this repository where the symbol is actually used — go read one rather than trusting an example.

Imported by (9)

  • ExceptionFiltersContextpackages/microservices/context/exception-filters-context.ts:16
  • ListenersControllerpackages/microservices/listeners-controller.ts:45
  • MicroservicesModulepackages/microservices/microservices-module.ts:23
  • NestMicroservicepackages/microservices/nest-microservice.ts:35
  • TestingInjectorpackages/testing/testing-injector.ts:23
  • TestingModuleOptionspackages/testing/testing-module.builder.ts:29
  • TestingModulepackages/testing/testing-module.ts:26
  • ExceptionFiltersContextpackages/websockets/context/exception-filters-context.ts:10

…and 1 more.

Was this page helpful?

Download as PDF
NestContainer — NestJS head-to-head