Pular para o conteúdo
Skillpedia
APIs e servidores (backend)280 mil · #91

nestjs-patterns

Ajuda seu agente a construir backends robustos em TypeScript usando NestJS. Ele entende padrões de módulos, controladores e provedores para criar aplicações eficientes.

O que ela faz

Este guia ensina como organizar e construir aplicações web usando a tecnologia NestJS. Ele mostra como dividir o código em partes (módulos, controladores, serviços) e como garantir que os dados recebidos estejam corretos e seguros.

Quando usar

  • ✓Ao começar um novo projeto web com NestJS.
  • ✓Ao organizar o código de um projeto NestJS existente.
  • ✓Ao adicionar validação de dados ou regras de segurança em uma API.

Exemplo do que pedir para a IA

“Como posso organizar meu código NestJS para que ele seja fácil de manter?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/nestjs-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/nestjs-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele sugere uma estrutura de pastas e exemplos de código para separar as responsabilidades. Mostra como validar os dados que chegam e como lidar com erros de forma consistente.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill nestjs-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/nestjs-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões de Desenvolvimento NestJS

Padrões NestJS de nível de produção para backends TypeScript modulares.

Quando Ativar

  • Construindo APIs ou serviços NestJS
  • Estruturando módulos, controllers e providers
  • Adicionando validação de DTO, guards, interceptors ou exception filters
  • Configurando configurações cientes do ambiente e integrações de banco de dados
  • Testando unidades NestJS ou endpoints HTTP

Estrutura do Projeto

src/
├── app.module.ts
├── main.ts
├── common/
│   ├── filters/
│   ├── guards/
│   ├── interceptors/
│   └── pipes/
├── config/
│   ├── configuration.ts
│   └── validation.ts
├── modules/
│   ├── auth/
│   │   ├── auth.controller.ts
│   │   ├── auth.module.ts
│   │   ├── auth.service.ts
│   │   ├── dto/
│   │   ├── guards/
│   │   └── strategies/
│   └── users/
│       ├── dto/
│       ├── entities/
│       ├── users.controller.ts
│       ├── users.module.ts
│       └── users.service.ts
└── prisma/ or database/
  • Mantenha o código de domínio dentro de módulos de funcionalidade.
  • Coloque filtros, decoradores, guards e interceptors transversais em common/.
  • Mantenha os DTOs próximos ao módulo que os possui.

Bootstrap e Validação Global

async function bootstrap() {
  const app = await NestFactory.create(AppModule, { bufferLogs: true });

  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
      transformOptions: { enableImplicitConversion: true },
    }),
  );

  app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));
  app.useGlobalFilters(new HttpExceptionFilter());

  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
  • Sempre ative whitelist e forbidNonWhitelisted em APIs públicas.
  • Prefira um pipe de validação global em vez de repetir a configuração de validação por rota.

Módulos, Controllers e Providers

@Module({
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService],
})
export class UsersModule {}

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get(':id')
  getById(@Param('id', ParseUUIDPipe) id: string) {
    return this.usersService.getById(id);
  }

  @Post()
  create(@Body() dto: CreateUserDto) {
    return this.usersService.create(dto);
  }
}

@Injectable()
export class UsersService {
  constructor(private readonly usersRepo: UsersRepository) {}

  async create(dto: CreateUserDto) {
    return this.usersRepo.create(dto);
  }
}
  • Controllers devem permanecer enxutos: parsear entrada HTTP, chamar um provider, retornar DTOs de resposta.
  • Coloque a lógica de negócios em serviços injetáveis, não em controllers.
  • Exporte apenas os providers que outros módulos realmente precisam.

DTOs e Validação

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

  @IsString()
  @Length(2, 80)
  name!: string;

  @IsOptional()
  @IsEnum(UserRole)
  role?: UserRole;
}
  • Valide cada DTO de requisição com class-validator.
  • Use DTOs de resposta dedicados ou serializadores em vez de retornar entidades ORM diretamente.
  • Evite vazar campos internos como hashes de senha, tokens ou colunas de auditoria.

Autenticação, Guards e Contexto da Requisição

@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('admin')
@Get('admin/report')
getAdminReport(@Req() req: AuthenticatedRequest) {
  return this.reportService.getForUser(req.user.id);
}
  • Mantenha estratégias de autenticação e guards locais ao módulo, a menos que sejam verdadeiramente compartilhados.
  • Codifique regras de acesso amplas em guards, depois faça a autorização específica de recursos em serviços.
  • Prefira tipos de requisição explícitos para objetos de requisição autenticados.

Exception Filters e Formato de Erro

@Catch()
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: unknown, host: ArgumentsHost) {
    const response = host.switchToHttp().getResponse<Response>();
    const request = host.switchToHttp().getRequest<Request>();

    if (exception instanceof HttpException) {
      return response.status(exception.getStatus()).json({
        path: request.url,
        error: exception.getResponse(),
      });
    }

    return response.status(500).json({
      path: request.url,
      error: 'Internal server error',
    });
  }
}
  • Mantenha um envelope de erro consistente em toda a API.
  • Lance exceções do framework para erros esperados do cliente; registre e envolva falhas inesperadas centralmente.

Configuração e Validação de Ambiente

ConfigModule.forRoot({
  isGlobal: true,
  load: [configuration],

…
Perguntas frequentes

O que são módulos, controladores e provedores?

Módulos organizam o código, controladores recebem as requisições e provedores (serviços) contêm a lógica de negócio.

Por que é importante validar os dados recebidos?

Para garantir que a aplicação receba apenas informações esperadas e seguras, evitando erros e falhas de segurança.

Como lidar com erros na aplicação?

O guia sugere usar filtros de exceção para padronizar a forma como os erros são reportados, tanto para o usuário quanto para o desenvolvedor.

Detalhes

Descrição original do autor

NestJS architecture patterns for modules, controllers, providers, DTO validation, guards, interceptors, config, and production-grade TypeScript backends. Use when building or reviewing a NestJS backend — modules, providers, DTO validation, guards, or interceptors.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#91
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas