Alura > Cursos de Programação > Cursos de Node.JS > Conteúdos de Node.JS > Primeiras aulas do curso Node.js: lidando com buscas, filtros, paginação e erros em uma API

Node.js: lidando com buscas, filtros, paginação e erros em uma API

Deixando nossa API resiliente - Apresentação

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.

Pré-requisito

Neste curso seguiremos com o projeto do curso anterior, que é um pré-requisito.

Node.js: API Rest com Express e MongoDB

É necessário ter concluído esse curso ou caso não tenha feito, que tenha os conhecimentos prévios necessários e o projeto.

API de livraria

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.

Você já deve saber:

É 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.

Você será capaz de…

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!

Deixando nossa API resiliente - Instalando o projeto

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.

Instalando o projeto

Clonando o projeto

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.

Instalando o projeto do zero

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.

Conferindo a conexão com o banco de dados

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.

Testando a conexão no Postman

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 e Livro.js.

Conclusão

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!

Deixando nossa API resiliente - Criando variáveis de ambiente

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.

Criando 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.

Usando uma variável de ambiente

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 GETem /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.

Conclusão

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.

Sobre o curso Node.js: lidando com buscas, filtros, paginação e erros em uma API

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:

Aprenda Node.JS acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas