Install
openclaw skills install @encryptshawn/nest-jsBuild production-grade NestJS applications with correct module architecture, dependency injection, decorators, guards, pipes, interceptors, middleware, microservices, and testing patterns. Use this skill whenever the user mentions NestJS, Nest.js, Nest framework, or is building a Node.js API with decorators, modules, providers, controllers, or TypeScript-first backend patterns that follow NestJS conventions. Also trigger when the user references NestJS concepts like guards, pipes, interceptors, custom decorators, DTOs with class-validator, TypeORM/Prisma/Mongoose integration in Nest, GraphQL resolvers in Nest, or CQRS. This skill covers NestJS-specific patterns — for general Node.js traps (event loop, streams, async pitfalls), see the NodeJS skill.
openclaw skills install @encryptshawn/nest-js| 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