| Topic | File |
|---|---|
| ------- | ------ |
| Module system, circular deps, dynamic modules | modules.md |
| DI, providers, injection scopes, custom providers | dependency-injection.md |
| Controllers, routing, request lifecycle | controllers.md |
| Guards, pipes, interceptors, middleware, filters | lifecycle.md |
| DTOs, validation, transformation | validation.md |
| Database integration (TypeORM, Prisma, Mongoose) | database.md |
| Testing: unit, integration, e2e | testing.md |
| Microservices, queues, events, WebSockets | microservices.md |
| Config, environment, secrets management | config.md |
| Performance, caching, serialization | performance.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 causeexportsed — 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共 1 个版本