logo site seligadev

Blog do Se Liga Dev - Notícias Gerais

Destrinchando o NestJS: do zero ao primeiro endpoint

Destrinchando o NestJS: do zero ao primeiro endpoint

### Se você sempre quis aprender **NestJS** mas não sabia por onde começar, esse guia é para você! ### Vamos passo a passo entender os fundamentos e colocar a mão na massa até termos nossa primeira API rodando. --- ## 1️⃣ Instalação do NestJS CLI ### 👉 Comando mágico para instalar a CLI: ``` npm i -g @nestjs/cli ``` --- ## 2️⃣ Criação do projeto ``` nest new meu-projeto ``` ### 📂 **Estrutura do projeto:** ``` 📂 meu-projeto ├── 📁 src │ ├── 📁 users │ │ ├── users.controller.ts │ │ ├── users.service.ts │ │ └── users.module.ts │ ├── app.module.ts │ ├── app.controller.ts │ ├── app.service.ts │ └── main.ts ├── .env ├── package.json └── tsconfig.json ``` --- ## 3️⃣ Utilizando a CLI para gerar atributos ``` nest generate module users nest generate service users nest generate controller users ``` --- ## 4️⃣ Entendendo os Módulos ### 📦 Conceito Fundamental #### Os **módulos** no NestJS são a unidade organizacional fundamental do framework, representando um mecanismo de encapsulamento e organização que define como os componentes da aplicação se relacionam e interagem entre si. ### 🧩 Definição Conceitual #### Um módulo no NestJS é essencialmente um **contêiner lógico** que agrupa funcionalidades relacionadas, fornecendo um contexto isolado onde providers, controllers, middlewares e outros elementos podem ser organizados de forma coesa. ### ⚙️ Características Teóricas Fundamentais #### 1. Encapsulamento Os módulos criam fronteiras bem definidas entre diferentes partes da aplicação, permitindo que cada módulo mantenha sua própria responsabilidade. #### 2. Injeção de Dependência Contextualizada Cada módulo possui seu próprio contexto de injeção de dependência, onde os providers são registrados e podem ser compartilhados. #### 3. Composição Hierárquica Os módulos seguem uma estrutura hierárquica onde existe um módulo raiz (root module) que importa outros módulos. ### 🏗️ Elementos Estruturais #### Decorator @Module() Cada módulo é definido através do decorator `@Module()`, que aceita: - **imports**: Define quais outros módulos são necessários - **controllers**: Especifica os controladores que pertencem ao módulo - **providers**: Lista os provedores de serviços disponíveis no módulo - **exports**: Determina quais providers podem ser utilizados por outros módulos --- ## 5️⃣ O que é Injeção de Dependência ### 👉 Conceito que ajuda a manter o código organizado, escalável e fácil de testar. > "A injeção de dependência é um padrão que permite que objetos recebam suas dependências de fontes externas, ao invés de criá-las internamente." --- ## 6️⃣ Entendendo o Lifecycle do NestJS #### O ciclo de vida define como o Nest lida com instâncias, inicialização e destruição. **Principais hooks do lifecycle:** - `onModuleInit()` - `onApplicationBootstrap()` - `onModuleDestroy()` - `beforeApplicationShutdown()` --- ## 7️⃣ Entendendo os Controllers ### 🎯 São os pontos de entrada da sua API. ### Responsáveis por: - Receber requisições HTTP - Validar dados de entrada - Chamar os services apropriados - Retornar respostas formatadas --- ## 8️⃣ Entendendo os Services ### 🧠 Aqui fica a lógica de negócio. ### Responsabilidades: - Implementar regras de negócio - Interagir com banco de dados - Processar dados - Comunicação com APIs externas --- ## 9️⃣ Expondo nossas portas #### 🌐 Por padrão, o NestJS roda em `http://localhost:3000`. #### Para alterar a porta, modifique o arquivo `main.ts`: ``` const port = process.env.PORT || 3000; await app.listen(port); ``` --- ## 🔟 O que é .env #### 📄 Arquivo para gerenciar variáveis de ambiente. Exemplo de `.env`: ``` DATABASE_URL=postgresql://user:password@localhost:5432/mydb JWT_SECRET=minha-chave-secreta PORT=3000 ``` --- ## 1️⃣1️⃣ Usando o .env com o ConfigModule do NestJS #### Exemplo de implementação: ``` import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ConfigModule.forRoot()], }) export class AppModule {} ``` --- ## 1️⃣3️⃣ Considerações finais #### 🎉 Você agora já tem a base para construir APIs poderosas com NestJS! **Próximos passos:** - Implementar autenticação - Conectar com banco de dados - Adicionar validações - Escrever testes > "O NestJS combina o melhor do TypeScript com padrões arquiteturais sólidos para criar aplicações robustas e escaláveis." --- **Compartilhe este guia com outros desenvolvedores!** 🚀

Prisma + NestJS: iniciando o acesso ao banco de dados

Prisma + NestJS: iniciando o acesso ao banco de dados

### Se você já subiu sua primeira API com **NestJS** , chegou a hora de dar um passo além: **conectar seu projeto ao banco de dados** . ### E aqui entra um dos **queridinhos da comunidade Node.js** → **Prisma ORM** ✨ --- ## 1️⃣ O que é o Prisma? ### Imagine o Prisma como o **"tradutor oficial"** entre seu código TypeScript e o banco de dados. ### Ele converte consultas SQL complexas em código simples, limpo e tipado. --- ## 2️⃣ Instalando o Prisma ### Dentro do seu projeto: ``` npm install prisma --save-dev npm install @prisma/client npx prisma init ``` #### Isso vai criar a pasta **`prisma/`** e o arquivo **`.env`** para configurar o banco. --- ## 3️⃣ Preparando o Ambiente ### Você já conhece o Docker e o Docker Compose, então vai utilizar para criar um banco Postgres. 1. Crie um arquivo na raiz do seu projeto ```bash sudo nano docker-compose.yaml ``` 2. Agora copie e cole em seu arquivo o código abaixo. ``` version: '3.5' services: db: image: postgres container_name: postgres_container volumes: - postgres:/data/postgres environment: POSTGRES_PASSWORD: changepass POSTGRES_USER: changeuser POSTGRES_DB: changename PGDATA: /data/postgres ports: - "5432:5432" networks: - postgres restart: unless-stopped volumes: postgres: ``` ## 4️⃣ Configurando o banco no `.env` ```env DATABASE_URL="postgresql://changeuser:changepass@localhost:5432/changename?schema=public" ``` > ⚡ Dica: Prisma funciona com PostgreSQL, MySQL, SQLite, MongoDB e outros! --- ## 5️⃣ Criando o schema do Prisma ### Arquivo: **`prisma/schema.prisma`** ``` model User { id Int @default(autoincrement()) @id email String @unique name String? posts Post[] } model Post { id Int @default(autoincrement()) @id title String content String? published Boolean? @default(false) author User? @relation(fields: [authorId], references: [id]) authorId Int? } ``` --- ## 6️⃣ Rodando as migrações ``` npx prisma migrate dev --name init ``` ``` 📂 prisma ├── 📁 migrations │ ├── 20201207100915_init │ │ └── migration.sql └── schema.prisma ``` #### Isso vai criar as tabelas no banco com base no seu schema. --- ## 7️⃣ Usando no NestJS ``` npm install @prisma/client ``` ### Crie o **PrismaService** : ``` 📂 meu-projeto-prisma ├── 📁 src │ ├── 📁 database │ │ └── prisma.service.ts │ ├── app.module.ts │ ├── app.controller.ts │ ├── app.service.ts │ └── main.ts ├── .env ├── package.json └── tsconfig.json ``` ``` import { Injectable, OnModuleInit } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit { async onModuleInit() { await this.$connect(); } } ``` --- ## 8️⃣ CRUD com Prisma ### No seu `UserService`: ``` async create(data: { name: string; email: string }) { return this.prisma.user.create({ data }); } async findAll() { return this.prisma.user.findMany(); } ``` --- ## 9️⃣ Prisma Studio 😍 ### Quer **ver seus dados com uma UI bonita** ? ``` npx prisma studio ``` --- ## 🔥 Conclusão ### Com o **Prisma** , você tem: #### ✅ Tipagem automática #### ✅ Migrações simples #### ✅ CRUD sem complicação #### ✅ Uma UI para brincar com os dados ##### Agora sua API NestJS está **pronta para brilhar** ! 🚀 --- ## 💬 Você já usou **Prisma** ou ainda está preso no **TypeORM/Sequelize** ?