TopicFileModule system, circular deps, dynamic modulesmodules.mdDI, providers, injection scopes, custom providersdependency-injection.mdControllers, routing, request lifecyclecontrollers.mdGuards, pipes, interceptors, middleware, filterslifecycle.mdDTOs, validation, transformationvalidation.mdDatabase integration (TypeORM, Prisma, Mongoose)database.mdTesting: unit, integration, e2etesting.mdMicroservices, queues, events, WebSocketsmicroservices.mdConfig, environment, secrets managementconfig.mdPerformance, caching, serializationperformance.md
NestJS builds on Node.js/Express (or Fastify) but introduces an opinionated architecture. The main things that catch people:
@Module, @Controller, @Injectable are not optional annotations, they drive the DI container and module graph.reflect-metadata), and emitDecoratorMetadata are load-bearing. Misconfigured tsconfig.json breaks DI silently.@Injectable() missing — class won't be in DI container, cryptic "resolve dependency" errorproviders array — same error, different causeexports ed — importing module can't see it, even though the module is importedforwardRef(() => ModuleClass) on BOTH sidesforwardRef(() => ServiceClass) + @Inject(forwardRef(...))@Body() empty — missing Content-Type: application/json header or body-parser not configuredapp.useGlobalPipes(new ValidationPipe()) or missing class-transformerfalse silently → 403 — no error message by default, must throw specific exception@Res() used → Nest loses response control — use @Res({ passthrough: true }) or avoid @Res()onModuleInit / onModuleDestroy — lifecycle hooks only fire if class is @Injectable() AND in providersConfigService.get() returns undefined — env var not in .env or ConfigModule not imported in that module