Validação e Serialização no NestJS: class-validator e class-transformer \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 16 Horas 

 53 Min 

 43 Seg 

   Tempo restante da oferta: 16 53 43 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Validação e Serialização no NestJS: class-validator e class-transformer  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) [ Node ](https://www.treinaweb.com.br/blog/categoria/node-js) 

# Validação e Serialização no NestJS: class-validator e class-transformer

 Vamos abordar a utilização de duas biblitecas de serialização e validação fundamentais no NestJS: class-validator e class-transformer

 [ Wesley Gado ](https://www.treinaweb.com.br/blog/autor/wesley-gado) 4 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/08/NEST-JS-CLASS-VALIDATOR-CLASS-TRANSFORMER.png)  

No artigo “[Criando o primeiro CRUD com NestJS](https://www.treinaweb.com.br/blog/criando-o-primeiro-crud-com-nestjs)” desenvolvemos uma aplicação para se comunicar com um banco de dados de cadastro de usuários, porém algo muito importante é saber como podemos utilizar recursos de validação e serialização no NestJS.

Para isto no NestJS há duas bibliotecas que nos auxiliam nestas tarefas de forma eficiente e prática: O class-validator e class-transformer, onde podemos consultar mais informações na própria [documentação do NestJS](https://docs.nestjs.com/techniques/validation).

Vamos ver como utilizar essas bibliotecas? 😀

[  ![TypeScript - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/typescript.svg)   Curso TypeScript - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/typescript-fundamentos)

## Instalação das bibliotecas class-validator e class-transformer

Primeiramente, vamos reutilizar o nosso projeto do artigo “[Criando o primeiro CRUD com NestJS](https://www.treinaweb.com.br/blog/criando-o-primeiro-crud-com-nestjs)” como exemplo, você também pode obter o projeto neste [repositório do github](https://github.com/wesleygado/artigo-crud-nestjs).

Ótimo, com o projeto em sua máquina, vamos instalar as bibliotecas, para isto basta utilizar o comando:

```bash
npm i class-validator class-transformer

```

## Validação com o class-validator

Após a instalação vamos utilizar o class-validator para validar algumas informações no cadastro de usuários da nossa aplicação. O class-validator trás uma série de decorators que podemos utilizar, que podem ser consultados na [documentação do class-validator](https://github.com/typestack/class-validator).

Neste caso, vamos utilizar as validações nos arquivos DTO que são responsáveis pelos dados das requisições da aplicação, portanto no arquivo create-user.dto.ts temos duas propriedades: `nome` e `idade`. Perceba que não há nenhuma validação, portanto nossa aplicação irá aceitar cadastros que estejam vazios, ou sem limite de caracteres e etc. Vamos melhorar isso!

Na propriedade `nome`, a validação será a seguinte: não pode ser vazia, e precisa ter entre 3 e 10 caracteres, portanto, podemos utilizar o decorator `@IsNotEmpty()` e o dacorator `@Length()`, ficando da seguinte forma:

```ts
import { IsNotEmpty, Length } from 'class-validator';

export class CreateUserDto {
  @IsNotEmpty({ message: 'Nome não pode ser vazio' })
  @Length(3, 10, { message: 'Nome precisa ter entre 3 e 10 caracteres' })
  nome: string;

  @IsNotEmpty()
  idade: number;
}

```

Repare que importamos o `IsNotEmpty` e `Lenght` da biblioteca `class-validator` e utilizamos na propriedade `nome`. Por ser um decorator, é possível passar alguns parâmetros, no caso do `@IsNotEmpty` criamos uma mensagem customizada (a biblioteca possui mensagens padrões, mas em inglês) e no caso do `@Lenght`, o número mínimo e máximo de caracteres e também uma mensagem.

Agora precisamos informar para a aplicação que ela deve utilizar as configurações de validação, para isso é necessário passar a seguinte configuração no arquivo `main.ts`, conforme baixo:

```ts
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();

```

Veja que configuramos a aplicação para utilizar as validações em nossa aplicação, ao tentar enviar uma requisição com o verbo HTTP POST para cadastro de um novo usuário com a propriedade nome com mais de 10 caracteres, obtemos o seguinte retorno:

![Validação de limite de caracteres com class-validator](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/08/1-validacao-caracteres-class-validator.png)

A aplicação já retorna um status code 400 Bad Request, com a mensagem que customizamos. Bem legal né? Vamos testar utilizando o decorator `@IsNotEmpty` para idade e passar uma idade nula:

![Validação vazio com class-validator](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/08/2-validacao-idade-null-class-validator.png)

Perceba que o retorno foi o mesmo Bad Request, agora na mensagem constando os dois campos que estão errados, porém veja que a mensagem do campo de idade está em inglês, pois não customizei a mensagem de propósito somente para exemplificar que o class-validator possui as mensagens padrões, que podem ser customizadas como fizemos na propriedade `nome`.

Ótimo! Mas e se for necessário criar uma validação customizada, é possível? A resposta é que sim! Podemos criar um novo decorator e também utilizar o `@Validate(ValidaçãoCustomizada)`. Então como podemos fazer isso?

### Validações customizadas

Primeiramente, vamos criar um arquivo na pasta `users` com o nome `validator-idade.ts`, será o arquivo que iremos configurar uma validação para verificar se a propriedade idade é maior que 18, ou seja, vamos simular um cadastro que o usuário deve ser maior de idade. O arquivo ficará da seguinte forma:

```ts
import {
  ValidatorConstraint,
  ValidatorConstraintInterface,
} from 'class-validator';

@ValidatorConstraint({ name: 'idadeValida', async: false })
export class IdadeValida implements ValidatorConstraintInterface {
  validate(idade: number) {
    return idade > 18 ? true : false;
  }

  defaultMessage() {
    return 'A idade precisa ser acima de 18 anos';
  }
}

```

Utilizaremos o decorator `@ValidatorConstraint`, que recebe como parâmetro o nome (name) e se é assíncrono (podemos ter validações mais avançadas que acessam banco de dados por exemplo, sendo importante ter essa possibilidade).

Logo em seguida vamos dar o nome da classe e implementar a interface que possui os métodos necessários para criar a validação, o principal deles é o método validate. Este método irá receber um parâmetro (que será a propriedade), com isso podemos fazer a validação e retornar true (se passou na validação) ou false em caso contrário.

Outro método que podemos utilizar é o defaultMessage, com ele podemos retornar uma mensagem caso não ocorra a validação com sucesso, lembre-se que essa mensagem pode ser alterada no próprio decorator utilizando a propriedade `{message: ‘mensagem’}`, como fizemos acima.

Agora vamos testar, o nosso DTO de usuário ficará da seguinte forma:

```ts
import { IsNotEmpty, Length, Validate } from 'class-validator';
import { IdadeValida } from '../validator-idade';

export class CreateUserDto {
  @IsNotEmpty({ message: 'Nome não pode ser vazio' })
  @Length(3, 10, { message: 'Nome precisa ter entre 3 e 10 caracteres' })
  nome: string;

  @IsNotEmpty()
  @Validate(IdadeValida)
  idade: number;
}

```

Utilizamos o decorator `@Validate()`, e como parâmetro o decorator recebe a classe da validação customizada, no caso a classe `IdadeValida`, agora ao cadastrar um usuário com idade menor que 18, recebemos o seguinte retorno:

![Validação customizada com class-validator](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/08/3-idade-valida-class-validator.png)

## Utilizando class-transformer

[  ![Express - Desenvolvendo aplicações web](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/express.svg)   Curso Express - Desenvolvendo aplicações web Conhecer o curso ](https://www.treinaweb.com.br/curso/express-desenvolvendo-aplicacoes-web)

Prefeito, aprendemos a utilizar o class-validator para validar as informações, agora podemos utilizar o class-transformer para manipular essa informação, por exemplo, vamos imaginar um cenário que os nomes devem estar todos com letras minúsculas, para isso podemos usar o decorator `@Transform()` nos Dtos, conforme abaixo:

```ts
import { Transform } from 'class-transformer';
import { IsNotEmpty, Length, Validate } from 'class-validator';
import { IdadeValida } from '../validator-idade';

export class CreateUserDto {
  @IsNotEmpty({ message: 'Nome não pode ser vazio' })
  @Length(3, 10, { message: 'Nome precisa ter entre 3 e 10 caracteres' })
  @Transform(({ value }) => value.toLowerCase())
  nome: string;

  @IsNotEmpty()
  @Validate(IdadeValida)
  idade: number;
}

```

Veja que utilizamos o `@Transform()`, onde recebemos um parâmetro que será a propriedade nome e convertemos a string em letras minúsculas. Porém, além do decorator, é necessário habilitar a utilização deste recurso lá no `app.useGlobalPipes` dentro do arquivo `main.ts`, utilizando a propriedade `{ transform: true }`, desta forma:

```tsx
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe({ transform: true }));
  await app.listen(3000);
}
bootstrap();

```

Ótimo, tudo configurado, vamos testar criando um usuário com o nome em letras maiúsculas e verificar o resultado:

![Covertendo propriedade em letras minucsculas com class-transform](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/08/4-transform-letras-minusculas-class-transform.png)

Veja que o usuário foi salvo com o nome em letras minúsculas conforme o esperado, bem interessante! Lembrando que é possível criar funções de acordo com a sua necessidade e tratar com o `@Transform()`.

### Recursos Expose e Exclude do class-transformer

O class-transformer também possui outros recursos interessantes como o `@Expose()` e `@Exclude()`, o primeiro basicamente podemos apontar para o NestJS como vamos trabalhar com a propriedade, já o segundo é usado para ocultarmos alguma propriedade. Vamos ver na prática, primeiramente vou alterar a propriedade nome para a requisição receber como `nome_completo` sem alterar o DTO ou a entidade, da seguinte maneira:

```ts
import { Expose, Transform } from 'class-transformer';
import { IsNotEmpty, Length, Validate } from 'class-validator';
import { IdadeValida } from '../validator-idade';

export class CreateUserDto {
  @IsNotEmpty({ message: 'Nome não pode ser vazio' })
  @Length(3, 10, { message: 'Nome precisa ter entre 3 e 10 caracteres' })
  @Transform(({ value }) => value.toLowerCase())
  @Expose({ name: 'nome_completo' })
  nome: string;

  @IsNotEmpty()
  @Validate(IdadeValida)
  idade: number;
}

```

Adicionamos o decorator `@Expose()`, apontando que vamos trabalhar com a propriedade `nome` como `nome_completo`, portanto ao receber a requisição, devemos passar com o nome do `@Expose()`:

![Utilizando recurso expose do class-transform](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/08/5-transform-expose-class-transform.png)

Neste caso, ao efetuar a requisição o NestJS considerou o DTO, e no retorno a entidade User.

Para que no response o class-transformer tenha efeito, precisamos apontar para o NestJS o uso dos [interceptors](https://docs.nestjs.com/interceptors), de forma resumida, é onde o nestJS manipula os dados entre as requisições, então devemos adicionar uma nova configuração no `main.ts`:

```ts
import { ClassSerializerInterceptor, ValidationPipe } from '@nestjs/common';
import { NestFactory, Reflector } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  //uso global de interceptor, e a serialização dos dados nas requisições.
  app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));
  app.useGlobalPipes(new ValidationPipe({ transform: true }));
  await app.listen(3000);
}
bootstrap();

```

Podemos então fazer as seguintes alterações no DTO, para que exiba a propriedade nome como `nome_completo` e utilizar o `@Exclude()` para não exibir a propriedade `id`:

```ts
import { Exclude, Expose, Transform } from 'class-transformer';
import { IsNotEmpty, Length, Validate } from 'class-validator';
import { IdadeValida } from '../validator-idade';

export class CreateUserDto {
  @IsNotEmpty({ message: 'Nome não pode ser vazio' })
  @Length(3, 10, { message: 'Nome precisa ter entre 3 e 10 caracteres' })
  @Transform(({ value }) => value.toLowerCase())
  @Expose({ name: 'nome_completo' })
  nome: string;

  @IsNotEmpty()
  @Validate(IdadeValida)
  idade: number;

  @Exclude()
  id: number;
}

```

Ao criarmos um novo usuário, vamos obter o retorno da seguinte forma:

![Utilizando recurso exclude do class-transformer](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/08/6-transform-exclude-class-transform.png)

Ótimo, agora o retorno está como `nome_completo` e não está exibindo o `id` como o esperado.

[  ![Nest.js - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/nest-js.svg)   Curso Nest.js - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/nestjs-fundamentos)

### Conclusão

Neste artigo abordamos de forma resumida alguns recursos das bibliotecas class-validator e class-transformer, que vão te ajudar a ganhar tempo e utilizar boas práticas ao desenvolver suas aplicações. Vale ressaltar que elas possuem vários outros recursos interessantes que podem ser consultados pelas suas respectivas documentações.

Por fim, caso queira aprender mais sobre [NestJS](https://nestjs.com/) saiba que aqui na [TreinaWeb](https://treinaweb.com.br/) temos o curso [Nest.js - Fundamentos](https://www.treinaweb.com.br/curso/nestjs-fundamentos) que possui **02h07 de vídeos** e um total de **18 exercícios**. Conheça também nossos outros cursos de [TypeScript](https://www.treinaweb.com.br/busca?q=TypeScript).

Veja quais são os tópicos abordados durante o curso de Nest.js - Fundamentos:

- Conhecendo a estrutura;
- Utilizando Nest CLI
- Entendendo Rotas, Controllers e Views;;
- Conexão com banco de dados;
- Usando TypeORM;
- Template Engine.

- [ #JavaScript ](https://www.treinaweb.com.br/blog/tag/javascript)
- [ #NodeJS ](https://www.treinaweb.com.br/blog/tag/nodejs)
- [ #TypeScript ](https://www.treinaweb.com.br/blog/tag/typescript)
- [ #NestJS ](https://www.treinaweb.com.br/blog/tag/nestjs)

Autor

 ![Wesley Gado](//secure.gravatar.com/avatar/1b770ca482a7232b1885881430a592bb?d=mm)

## Wesley Gado

 Formado em Análise e Desenvolvimento de Sistemas pelo Instituto Federal de São Paulo, atuou em projetos como desenvolvedor Front-End. Nas horas vagas grava Podcast e arrisca uns três acordes no violão. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wesley-gado)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/NEST-JS-UPLOAD-ARQUIVOS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     3 anos atrás

    ##  [ Guia do framework NestJS ](https://www.treinaweb.com.br/blog/guia-do-framework-nestjs) 

     Neste guia do framework NestJS vamos fazer um compilado de tópicos úteis sobre o framework, desde criar um projeto básico até autenticação.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/07/CRIANDO-PRIMEIRO-CRUD-COM-NESTJS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Criando o primeiro CRUD com NestJS ](https://www.treinaweb.com.br/blog/criando-o-primeiro-crud-com-nestjs) 

     Neste artigo veremos como criar um CRUD com NestJS, o passo a passo utilizando ferramentas como o TypeORM e o banco de dados SQLite.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/09/PUB-DEV-400x280.jpg)  [ Flutter ](https://www.treinaweb.com.br/blog/categoria/flutter) 

     4 anos atrás

    ##  [ Gerenciador de pacotes Dart e Flutter ](https://www.treinaweb.com.br/blog/gerenciador-de-pacotes-dart-e-flutter) 

     Saiba o que é o gerenciador de pacotes Dart e Flutter, como utilizar um pacote, biblioteca instalada por ele e sobre o pubspec.yaml.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Guias ](https://www.treinaweb.com.br/blog/categoria/guias) 

     3 anos atrás

    ##  [ Guia da linguagem Go ](https://www.treinaweb.com.br/blog/guia-da-linguagem-go) 

     Nesse guia de Go você aprenderá o necessário para criar os seus primeiros softwares com a linguagem de programação Go. Acesse agora mesmo!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/09/04112944/DJANGO-PROJETOS-PYCHARM-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     2 anos atrás

    ##  [ Validação de dados em aplicações Django ](https://www.treinaweb.com.br/blog/validacao-de-dados-em-aplicacoes-django) 

     Aprenda como trabalhar com validação de dados em aplicações Django, utilizando validações padrões e customizadas.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/05/validando-documentos-json-no-php-com-json-schema-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     10 anos atrás

    ##  [ Validando documentos JSON no PHP com JSON Schema ](https://www.treinaweb.com.br/blog/validando-documentos-json-no-php-com-json-schema) 

     JSON Schema é uma especificação para validação de documentos JSON. A ideia é parecida com a de um XSD (XML Schema Definition). Veja como documentos JSON podem ser validados.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/10/TESTE-CAIXA-BRANCA-400x280.png)  [ Testes e Projetos ](https://www.treinaweb.com.br/blog/categoria/testes-e-projetos) 

     6 anos atrás

    ##  [ Principais técnicas de testes estruturais ](https://www.treinaweb.com.br/blog/principais-tecnicas-de-testes-estruturais) 

     O teste estrutural pode ser considerado um dos mais importantes tipos de validação de software, tendo como resultado a diminuição no número de erros no sistema e, portanto, contribuindo com uma maior qualidade e confiabilidade.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/12/TS-ZOD-400x280.jpg)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     3 anos atrás

    ##  [ O que é o Zod? ](https://www.treinaweb.com.br/blog/o-que-e-o-zod) 

     Neste artigo vamos ter uma introdução sobre o Zod, uma biblioteca de declaração e validação de dados em TypeScript e criar um exemplo de como utilizá-la.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     3 anos atrás

    ##  [ Gerenciamento de dependências no Go ](https://www.treinaweb.com.br/blog/gerenciamento-de-dependencias-no-go) 

     Nesse artigo veremos como podemos utilizar o Go Tools para realizar o gerenciamento de dependências no Go.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Trabalhando com funções na Golang ](https://www.treinaweb.com.br/blog/trabalhando-com-funcoes-na-golang) 

     Neste artigo vamos aprender sobre as funções na Golang. Veremos o que são, qual a sua importância em nossos programas e como utilizá-las.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/10/principais-tecnicas-de-testes-funcionais-400x280.png)  [ Testes e Projetos ](https://www.treinaweb.com.br/blog/categoria/testes-e-projetos) 

     6 anos atrás

    ##  [ Principais técnicas de testes funcionais ](https://www.treinaweb.com.br/blog/principais-tecnicas-de-testes-funcionais) 

     Existem vários métodos que podem ser aplicados na hora de optar pelo teste funcional. Neste artigo vamos comentar brevemente sobre as principais técnicas de testes funcionais.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/10/Criando_mascara_monetaria_com_expressoes_regulares-400x280.jpg)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     3 anos atrás

    ##  [ Criando máscara monetária com expressões regulares ](https://www.treinaweb.com.br/blog/criando-mascara-monetaria-com-expressoes-regulares) 

     Nesse artigo aprenderemos a criar uma máscara para inputs que irá deixar seus projetos mais profissionais utilizando as expressões regulares.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **16h 53min 43s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
