Introdução

Neste tutorial, você aprenderá a criar aplicações escaláveis utilizando TypeScript e o framework NestJS. NestJS é um framework para construir aplicações do lado do servidor que utiliza conceitos da programação orientada a objetos e é baseado em tipos do TypeScript, o que traz robustez e escalabilidade ao desenvolvimento. Vamos abordar toda a cadeia de desenvolvimento, desde a configuração do ambiente até a implementação de validações e gerenciamento de dependências, garantindo que sua aplicação seja bem estruturada e fácil de manter. Este guia é ideal para desenvolvedores que desejam aprimorar seus conhecimentos em TypeScript e em práticas recomendadas para o desenvolvimento de aplicações escaláveis.

Etapas

  1. Configuração do Ambiente de Desenvolvimento

    Certifique-se de ter o Node.js e o npm instalados em sua máquina. Verifique as versões instaladas usando os comandos `node -v` e `npm -v`. Caso não os tenha instalados, siga as instruções oficiais do site do Node.js.

    commands
    # Verificar versões instaladas
    node -v
    npm -v

  2. Criação do Projeto NestJS

    Utilize o CLI do NestJS para gerar um novo projeto. Abra o terminal e execute o comando abaixo, substituindo ‘minha-aplicacao’ pelo nome do seu projeto.

    commands
    npm install -g @nestjs/cli
    nest new minha-aplicacao

  3. Estrutura do Projeto

    Uma vez criado o projeto, navegue até o diretório da aplicação. Inspecione a estrutura do projeto, que contém diretórios para módulos, controladores e serviços, fundamentais para organizar sua aplicação.

    commands
    cd minha-aplicacao
    ls -la

  4. Instalação de Ferramentas de Validação

    Para garantir que os dados recebidos na aplicação sejam válidos, vamos instalar o class-validator e class-transformer. Execute o seguinte comando no terminal.

    commands
    npm install class-validator class-transformer

  5. Criação do Módulo e Controlador de Produtos

    Crie um novo módulo e controlador para gerenciar produtos. Utilize o comando abaixo para gerar ambos os componentes:

    commands
    nest generate module produtos
    nest generate controller produtos

  6. Implementação do DTO e Validações

    Crie a classe DTO (Data Transfer Object) que servirá para validar os dados de criação e atualização dos produtos. As validações serão aplicadas utilizando o class-validator.

    Produto.dto.ts
    import { IsNotEmpty, IsNumber } from 'class-validator';
    
    export class ProdutoDto {
        @IsNotEmpty()
        nome: string;
    
        @IsNumber()
        preco: number;
    }

  7. Implementação do Serviço de Produtos

    Crie um serviço para encapsular a lógica de negócios relacionada a produtos. O serviço utilizará um array em memória inicialmente para armazenar produtos e simular operações no banco de dados.

    Produto.service.ts
    import { Injectable } from '@nestjs/common';
    import { ProdutoDto } from './dto/produto.dto';
    
    @Injectable()
    export class ProdutosService {
        private produtos = [];
    
        create(produtoDto: ProdutoDto) {
            const produto = { id: Date.now(), ...produtoDto };
            this.produtos.push(produto);
            return produto;
        }
    
        findAll() {
            return this.produtos;
        }
    }

  8. Implementação dos Métodos no Controlador de Produtos

    Complete o controlador de produtos para expor os endpoints de criação e listagem de produtos, utilizando os serviços criados anteriormente.

    Produto.controller.ts
    import { Body, Controller, Get, Post } from '@nestjs/common';
    import { ProdutosService } from './produtos.service';
    import { ProdutoDto } from './dto/produto.dto';
    
    @Controller('produtos')
    export class ProdutosController {
        constructor(private readonly produtosService: ProdutosService) {}
    
        @Post()
        create(@Body() produtoDto: ProdutoDto) {
            return this.produtosService.create(produtoDto);
        }
    
        @Get()
        findAll() {
            return this.produtosService.findAll();
        }
    }

  9. Criação de Testes Unitários

    Utilize Jest para criar testes unitários para o controller e o serviço de produtos. O NestJS já vem configurado com Jest. Aqui está um exemplo de teste do serviço.

    Produto.service.spec.ts
    import { Test, TestingModule } from '@nestjs/testing';
    import { ProdutosService } from './produtos.service';
    import { ProdutoDto } from './dto/produto.dto';
    
    describe('ProdutosService', () => {
        let service: ProdutosService;
    
        beforeEach(async () => {
            const module: TestingModule = await Test.createTestingModule({
                providers: [ProdutosService],
            }).compile();
            service = module.get<ProdutosService>(ProdutosService);
        });
    
        it('should be defined', () => {
            expect(service).toBeDefined();
        });
    
        it('should create a product', () => {
            const produtoDto: ProdutoDto = { nome: 'Produto Teste', preco: 100 };
            const produto = service.create(produtoDto);
            expect(produto).toHaveProperty('id');
            expect(produto.nome).toBe(produtoDto.nome);
        });
    });

  10. Executando a Aplicação e Testes

    Use o comando `npm run start` para executar a aplicação. Após isso, você pode enviar requisições para testar a API usando uma ferramenta como Postman ou cURL.

    commands
    # Executar a aplicação
    npm run start
    # Testar o endpoint de criar produto
    curl -X POST -H "Content-Type: application/json" -d '{"nome":"Novo Produto","preco":99.99}' http://localhost:3000/produtos

Conclusão

Neste tutorial, você aprendeu a desenvolver uma aplicação escalável em TypeScript utilizando o framework NestJS, abordando a criação de módulos, controladores e serviços. Abordamos a validação de dados com class-validator e implementamos testes unitários para garantir a qualidade do código. Com esses fundamentos, você está pronto para construir aplicações mais complexas e robustas em TypeScript, aproveitando as funcionalidades oferecidas pelo NestJS.

Hashtags

#TypeScript #NestJS #DesenvolvimentoDeSoftware #ValidaçãoDeDados #TestesUnitarios