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
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 -vCriaçã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.
commandsnpm install -g @nestjs/cli
nest new minha-aplicacaoEstrutura 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.
commandscd minha-aplicacao
ls -laInstalaçã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.
commandsnpm install class-validator class-transformer
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:
commandsnest generate module produtos
nest generate controller produtosImplementaçã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.tsimport { IsNotEmpty, IsNumber } from 'class-validator'; export class ProdutoDto { @IsNotEmpty() nome: string; @IsNumber() preco: number; }
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.tsimport { 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; } }
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.tsimport { 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(); } }
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.tsimport { 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); }); });
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.