Loading...
Loading...
NestJS 11+ best practices for enterprise Node.js applications with TypeScript. Use when writing, reviewing, or refactoring NestJS controllers, services, modules, or APIs. Triggers on: NestJS modules, controllers, providers, dependency injection, @Injectable, @Controller, @Module, middleware, guards, interceptors, pipes, exception filters, ValidationPipe, class-validator, class-transformer, DTOs, JWT authentication, Passport strategies, @nestjs/passport, TypeORM entities, Prisma client, Drizzle ORM, repository pattern, circular dependencies, forwardRef, @nestjs/swagger, OpenAPI decorators, GraphQL resolvers, @nestjs/graphql, microservices, TCP transport, Redis transport, NATS, Kafka, NestJS 11 breaking changes, Express v5 migration, custom decorators, ConfigService, @nestjs/config, health checks, or NestJS testing patterns.
npx skill4agent add ejirocodes/agent-skills nestjs-best-practices| Topic | When to Use | Reference |
|---|---|---|
| Core Architecture | Modules, Providers, DI, forwardRef, custom decorators | core-architecture.md |
| Request Lifecycle | Middleware, Guards, Interceptors, Pipes, Filters | request-lifecycle.md |
| Validation & Pipes | DTOs, class-validator, ValidationPipe, transforms | validation-pipes.md |
| Authentication | JWT, Passport, Guards, Local/OAuth strategies, RBAC | authentication.md |
| Database | TypeORM, Prisma, Drizzle ORM, repository patterns | database-integration.md |
| Testing | Unit tests, E2E tests, mocking providers | testing.md |
| OpenAPI & GraphQL | Swagger decorators, resolvers, subscriptions | openapi-graphql.md |
| Microservices | TCP, Redis, NATS, Kafka patterns | microservices.md |
@Module({
imports: [DatabaseModule],
controllers: [UsersController],
providers: [UsersService],
exports: [UsersService], // Export for other modules
})
export class UsersModule {}@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Post()
create(@Body() createUserDto: CreateUserDto) {
return this.usersService.create(createUserDto);
}
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
return this.usersService.findOne(id);
}
}import { IsEmail, IsString, MinLength, IsOptional } from 'class-validator';
export class CreateUserDto {
@IsEmail()
email: string;
@IsString()
@MinLength(8)
password: string;
@IsOptional()
@IsString()
name?: string;
}@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const status = exception.getStatus();
response.status(status).json({
statusCode: status,
message: exception.message,
timestamp: new Date().toISOString(),
});
}
}@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
canActivate(context: ExecutionContext) {
return super.canActivate(context);
}
}*splat/:file{.:ext}forwardRef()forwardRef(() => ModuleName)throw new BadRequestException('message')@Injectable()whitelist: truewhitelist: true, forbidNonWhitelisted: trueexportsConfigModule.forRoot()overrideProvider()overrideProvider(Service).useValue(mock)