Boas-vindas a mais um curso de Node.JS: tratamento de erros e busca. Me chamo Antônio Evaldo e serei o seu instrutor ao longo deste curso.
Antônio Evaldo é um homem branco, olhos escuros e cabelos escuros encaracolados. Usa bigode e cavanhaque e está com os cabelos amarrados atrás da cabeça. Veste uma camiseta preta e lisa. Ao fundo, há uma parede iluminada por uma luz azul gradiente e um quadro de uma guitarra vermelha.
Neste curso seguiremos com o projeto do curso anterior, que é um pré-requisito.
É necessário ter concluído esse curso ou caso não tenha feito, que tenha os conhecimentos prévios necessários e o projeto.
Seguiremos com o API de livraria, e veremos sobre:
Em tratamento de erros, vamos entender o porque a API deve tratar os erros e como podemos aplicar isso de forma mais robusta. Isso auxilia bastante o time de front-end que está trabalhando com essa API também, até mesmo no nosso desenvolvimento.
Vamos compreender melhor sobre os middlewares no Express (que estamos usando até o momento e talvez você não saiba). Entenderemos como o Express lida com middlewares, e criaremos novos já que existem diversos tipos. Vamos analisar como eles servem principalmente para reutilizar código.
Também aprenderemos sobre a validação de dados que vem do front-end. Por exemplo, quando alguém cadastra um novo livro ou autor, é importante validarmos para que não ocorra inconsistência de informações no banco de dados.
Aprenderemos também sobre buscas e filtros. No curso anterior foi feita uma busca simples usando parâmetros de busca, mas avançaremos mais nessa parte para implementarmos buscas e filtros mais avançados usando operadores do MongoDB.
Por fim, vamos entender sobre paginação, veremos mais os conceitos básicos, mas importantes para fazermos uma implementação bem legal na nossa API.
Vamos visualizar o código do projeto!
Estou com o VS Code aberto, vamos analisar dentro da pasta src
a estrutura de arquivos do lado esquerdo:
Observe que temos duas novas pastas: erros
e middlewares
. Clicando na pasta erros
, temos a seguinte estrutura:
E na pasta middlewares
, temos:
Na pasta de erros
, vamos tratar justamente de alguns erros específicos que podem ocorrer na nossa aplicação, como o de validação. Já em middlewares
tratamos o erro 404, erros gerais (manipuladorDeErros
) e temos um middleware de paginar
, que serve para reutilizarmos esse código de paginação.
Outra coisa que vamos mexer bastante no curso, é dentro da pasta controllers
. Nela, temos um arquivo chamado de livrosController.js
onde temos um método chamado de processaBusca
, sendo onde aplicaremos a parte de buscas e filtros mais avançados.
É necessário ter o conhecimento de CRUD usando o Node.js, Express e mongoose. Isso é abordado no curso anterior! Também precisa ter conhecimento sobre como funciona o Modelo MVC (Models, Views, Controllers).
O MVC é o modelo de arquitetura que estamos usando nessa API.
Ao finalizar o curso, você será capaz de criar APIs mais robustas, com tratamento de erros e validações de dados. Também entenderemos melhor as ferramentas que estamos usando por trás, além disso, vamos lidar com mais situações comuns no mercado de trabalho.
Estou bem feliz de compartilhar esse conhecimento com vocês. Espero que gostem e até mais!
Olá! Eu sou a Juliana Amoasei. O curso anterior de API com Express e Mongo foi atualizado e, com isso, algumas refatorações de código que o Evaldo iria fazer durante este curso perderam a função.
Sendo assim, em vez de usarmos o projeto do curso anterior para continuar com este, vamos baixar novamente o projeto do repositório que disponibilizamos na atividade Preparando o ambiente, instalar esse projeto do zero, fazer algumas configurações e, a partir disso, o Evaldo continua com os novos conteúdos.
Audiodescrição: Juliana é uma mulher branca, de olhos castanho-escuros, e cabelo curto e liso pintado de azul. Ela usa óculos de armação redonda vermelha, tem piercing no nariz, veste uma camisa preta da Alura e usa brincos prateados. Ao fundo, uma parede lisa iluminada em degradê azul e verde, com uma estante preta com enfeites à esquerda.
A primeira coisa a fazer é acessar o link do GitHub que deixamos disponível e clonar o projeto.
Para isso, vamos no botão verde "Code" para copiar o endereço do repositório. Já deixamos o Visual Studio Code pronto, na pasta "/Desktop" no terminal do VSC, onde queremos clonar o projeto.
Após o comando git clone
, colamos o endereço do repositório. Em seguida, adicionamos o nome que vamos chamar a pasta, nesse caso, api-express-mongo
. Você pode colocar o nome que desejar.
git clone git@github.com:alura-cursos/api-node-express-2.git api-express-mongo
Após clonar, podemos abrir a pasta em "File > Open Folder…". Feito isso, vamos até "Desktop", para onde copiamos o projeto, selecionamos api-express-mongo
, e podemos começar a trabalhar.
A segunda coisa a fazer é abrir o terminal novamente, já na pasta api-express-mongo
, e instalar o projeto do zero, com o comando npm i
, ou npm install
, ambos funcionam.
npm i
npm install
É um projeto bem curto que instala rapidamente.
Antes de executar o projeto, precisamos conferir a conexão com o banco de dados, que já foi feita no curso anterior. Para isso, também deixamos o link do Mongo Atlas disponível no material.
Já logamos no nosso projeto alura-node
, que foi o projeto criado anteriormente.
Se você não tem mais no Mongo Atlas o projeto usado no curso anterior, também vamos deixar materiais para você refazer esses passos, tanto em vídeo quanto em texto.
Vamos clicar no nome do projeto alura-node
no Mongo Atlas, para abrir algumas opções. Uma delas é o botão "Connect". Após clicar nele, selecionaremos a opção "Drivers" que aparece no modal.
No passo 3, podemos copiar a string de conexão:
mongodb+srv://admin:<password>@alura-node.8izxr2w.mongodb.net/?retryWrites=true&
Feito isso, vamos voltar ao VSC e fechar o terminal por enquanto. Vamos relembrar onde adicionamos essa string de conexão no nosso projeto? Dentro de "src > config > dbConnect.js
".
No arquivo dbConnect.js
, vamos substituir a string de conexão, que é o parâmetro de mongoose.connect()
. Selecionaremos a que estava anteriormente e colar a nova. Depois de mongodb.net
nessa string, há algumas opções extras que vamos retirar, porque não vamos precisar delas.
dbConnect.js
:
import mongoose from "mongoose"
mongoose.connect("mongodb+srv://admin:<password>@alura.node.8izxr2w.mongodb.net/");
let db = mongoose.connection;
export default db;
Para essa string de conexão funcionar, você pode ter notado que os dados de usuário e senha vieram como admin:<password>
. Esse password
é um placeholder, então temos que substituir tanto o nome de usuário, que no nosso caso é admin
, quanto a senha, que no nosso caso é admin123
.
Você deve substituir pelos seus dados de usuário e senha.
import mongoose from "mongoose"
mongoose.connect("mongodb+srv://admin:admin123@alura.node.8izxr2w.mongodb.net/");
let db = mongoose.connection;
export default db;
Vamos deixar a senha e o nome de usuário hardcoded (fixos) no código. Não tem problema exibi-los no vídeo, porque o nosso banco será destruído logo após a gravação.
Uma vez salvo o arquivo, podemos abrir o terminal em "Terminal > New Terminal". Já estamos na pasta certa, então vamos executar com o comando npm run dev
e conferir se o servidor local vai subir.
npm run dev
Ele subiu o servidor e a conexão com o banco foi feita com sucesso.
Vamos abrir o Postman e fazer um teste em "localhost:3000/autores" com o método GET.
GET localhost:3000/autores
Após clicar em "Send", é retornado apenas um registro, que tínhamos no banco anterior.
[{"_id":"65a178cc895332f24d0f1a2b","nome":"Machado de Assis","nacionalidade":"brasileiro"}]
O mesmo vale para "localhost:3000/livros". Vamos fazer um teste com GET:
GET localhost:3000/livros
[
{
"_id": "65a17956895332f24d0f1a2e",
"titulo": "Dom Casmurro",
"autor": {
"_id": "65a178cc895332f24d0f1a2b",
"nome": "Machado de Assis",
"nacionalidade": "brasileiro"
},
"editora": "Editora Alura",
"numeroPaginas": 123,
"__v": 0
}
]
Ele trouxe um livro para nós, pois também só tínhamos feito um. Se você acabou de criar esse banco e está reconectando, você deve receber um array vazio no lugar de dados, mas é possível fazer alguns testes adicionando livros e autores com o método POST.
Relembrando: como saber quais são os dados JSON para inserir um novo autor e um novo livro? Basta conferir no modelo (pasta "models") quais são as propriedades, em
Autor.js
eLivro.js
.
A string de conexão que acabamos de inserir é um dado sensível. Sendo assim, agora vamos proteger esses dados para não subi-los no GitHub. Aprenderemos isso na sequência!
Como utilizar dados sensíveis, como nomes de usuários e senhas, em nosso código, sem comprometer esses dados, ou seja, sem expô-los para quem não deveria ver? Nós usamos na programação uma ferramenta, que chamamos de variáveis de ambiente.
Como nós usamos variáveis de ambiente em um projeto Node? Abrimos o terminal e começamos instalando a biblioteca específica para isso, do Node, escrevendo npm install dotenv@16.0.3
, portanto a biblioteca Dotenv, na versão 16.0.3, que é a versão que vamos usar neste projeto. Esta é uma biblioteca pequena, ela é instalada rapidamente.
O ideal é que iniciarmos o Dotenv no ponto mais externo do projeto, ou seja, o arquivo por iniciamos a nossa aplicação. No nosso caso, é o server.js
. Então abriremos esse arquivo e, na primeira linha, antes de qualquer outra importação, importamos a biblioteca com import "dotenv/config"
.
Arquivo
server.js
import "dotenv/config";
import app from "./src/app.js";
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Servidor escutando em http://localhost:${port}`);
});
Após salvarmos o server.js
, criaremos um novo arquivo na raiz do projeto, e esse arquivo deve se chamar .env
. Nesse arquivo, começamos a criar nossas variáveis de ambiente. Como toda variável, começamos dando um nome para ela, sem usar const
, var
ou let
, apenas escrevendo o nome dela. Chamaremos de STRING_CONEXAO_DB
e atribuímos o valor, que buscamos no arquivo dbConnect.js
. No caso, copiamos a string dentro do mongoose.connect()
sem as aspas, porque não precisamos delas.
Arquivo
.env
STRING_CONEXAO_DB=mongodb+srv://alura:123@alura.dkjed.mongodb.net/
Boas práticas: O padrão para variáveis de ambiente é serem criadas com todas as letras em maiúsculas, utilizando underline no lugar de camelCase, que costuma ser o padrão do JavaScript, e sem espaços.
Após salvarmos o arquivo .env
, retornamos ao dbconnect.js
, onde podemos substituir a string que acabamos de copiar pela variável de ambiente que acabamos de criar. Vamos deletar a string que está dentro de mongoose.connect()
, e substituir por process.env.STRING_CONEXAO_DB
.
Arquivo
dbConnect.js
import mongoose from "mongoose"
mongoose.connect(process.env.STRING_CONEXAO_DB);
let db = mongoose.connection;
Antes de testarmos, há um passo muito importante para fazer a variável de ambiente funcionar: adicionar o nosso arquivo .env
no arquivo .gitignore
. Isso impede que as nossas variáveis de ambiente sejam enviadas para um repositório, especialmente um repositório público, que não queremos que compartilhe essas informações.
Arquivo
.gitignore
node_modules
.env
Após salvar o arquivo .env
, abriremos um novo terminal e reiniciaremos o servidor, com o comando npm run dev
, para verificar se tudo está funcionando. Após uma conexão de sucesso com o banco, retornamos ao Postman, onde tentaremos fazer um novo GET
em /livros
e depois em /autores
. Ambos funcionando. Portanto, a substituição dos dados de conexão por uma variável de ambiente foi bem sucedida.
Nós usamos as variáveis de ambiente de formas diferentes, dependendo da ferramenta que usamos, mas há dois princípios que são sempre os mesmos. Elas são chamadas de variáveis de ambiente porque fazem parte de um ambiente específico, onde são executadas em um sistema ou uma aplicação.
Na prática, ou criamos valores específicos para cada ambiente, através das variáveis de ambiente, ou em para proteger dados sensíveis de serem expostos, como fizemos aqui. Por exemplo, uma variável de ambiente pode apontar para um banco de dados, ou um ambiente de desenvolvimento pode apontar para outro, mas também podem impedir dados de ficarem disponíveis em contextos em que eles não estão autorizados.
Só falta mais uma pequena implementação para chegarmos no ponto onde vamos continuar com o resto das funcionalidades. Então, vamos finalizar essa parte.
O curso Node.js: lidando com buscas, filtros, paginação e erros em uma API possui 199 minutos de vídeos, em um total de 54 atividades. Gostou? Conheça nossos outros cursos de Node.JS em Programação, ou leia nossos artigos de Programação.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.