Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
ejirocodes avatar

Nestjs Best Practices

  • 224 installs
  • 5 repo stars
  • Updated June 25, 2026
  • ejirocodes/agent-skills

Guide agents writing NestJS modules, DI, guards, and services so new APIs follow production patterns for auth, validation, security, and maintainable structure.

About

Agent skill encoding NestJS best practices for modules, dependency injection, guards, validation, security, and performance. It steers backend implementations toward maintainable, production-ready Node APIs and SaaS services.

  • Module and dependency-injection patterns
  • Auth, guards, and validation guidance
  • Security and performance conventions
  • Production-ready service structure
  • Reduces NestJS architectural drift

Nestjs Best Practices by the numbers

  • 224 all-time installs (skills.sh)
  • Ranked #1,781 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
  • Data as of Jul 24, 2026 (Skillselion catalog sync)
npx skills add https://github.com/ejirocodes/agent-skills --skill nestjs-best-practices

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs224
repo stars5
Last updatedJune 25, 2026
Repositoryejirocodes/agent-skills

What it does

Guide agents writing NestJS modules, DI, guards, and services so new APIs follow production patterns for auth, validation, security, and maintainable structure.

Files

SKILL.mdMarkdownGitHub ↗

NestJS 11 Best Practices

Quick Reference

TopicWhen to UseReference
Core ArchitectureModules, Providers, DI, forwardRef, custom decoratorscore-architecture.md
Request LifecycleMiddleware, Guards, Interceptors, Pipes, Filtersrequest-lifecycle.md
Validation & PipesDTOs, class-validator, ValidationPipe, transformsvalidation-pipes.md
AuthenticationJWT, Passport, Guards, Local/OAuth strategies, RBACauthentication.md
DatabaseTypeORM, Prisma, Drizzle ORM, repository patternsdatabase-integration.md
TestingUnit tests, E2E tests, mocking providerstesting.md
OpenAPI & GraphQLSwagger decorators, resolvers, subscriptionsopenapi-graphql.md
MicroservicesTCP, Redis, NATS, Kafka patternsmicroservices.md

Essential Patterns

Module with Providers

@Module({
  imports: [DatabaseModule],
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService], // Export for other modules
})
export class UsersModule {}

Controller with Validation

@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);
  }
}

DTO with Validation

import { IsEmail, IsString, MinLength, IsOptional } from 'class-validator';

export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsString()
  @MinLength(8)
  password: string;

  @IsOptional()
  @IsString()
  name?: string;
}

Exception Filter

@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(),
    });
  }
}

Guard with JWT

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  canActivate(context: ExecutionContext) {
    return super.canActivate(context);
  }
}

NestJS 11 Breaking Changes

  • Express v5: Wildcards must be named (e.g., *splat), optional params use braces /:file{.:ext}
  • Node.js 20+: Minimum required version
  • Fastify v5: Updated adapter for Fastify users
  • Dynamic Modules: Same module with identical config imported multiple times = separate instances

Common Mistakes

1. Not using `forwardRef()` for circular deps - Causes "cannot resolve dependency" errors; wrap in forwardRef(() => ModuleName) 2. Throwing plain errors instead of HttpException - Loses status codes, breaks exception filters; use throw new BadRequestException('message') 3. Missing `@Injectable()` decorator - Provider won't be injectable; always decorate services 4. Global ValidationPipe without `whitelist: true` - Allows unexpected properties; set whitelist: true, forbidNonWhitelisted: true 5. Importing modules instead of exporting providers - Use exports array to share providers across modules 6. Async config without `ConfigModule.forRoot()` - ConfigService undefined; import ConfigModule in AppModule 7. Testing without `overrideProvider()` - Uses real services in unit tests; mock dependencies with overrideProvider(Service).useValue(mock) 8. E2E tests sharing database state - No isolation between tests; use transactions or truncate tables in beforeEach

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.