Escolar Documentos
Profissional Documentos
Cultura Documentos
• Benefícios
▪ Performance excelente
▪ Código em javascript
▪ Possui gerenciador de pacotes NPM
▪ É portátil
▪ Grande comunidade
Revisando NodeJs
Características do Node
Características do Node
Dependências do Node
• Bibliotecas padrões presentes no
Nodejs
▪ https://nodejs.org/dist/latest-v14.x/docs/api/
Instalando o NodeJS
• Linux
Instalando NodeJS
• Windows
▪ Utilizando o gerenciador de pacotes Chocolatey
✓ No powerShell
✓ executa Get-ExecutionPolicy
– verifica se o presente no sistema está compatível
com o que o Chocolatey precisa
– Caso ele retorne Restricted
» Set-ExecutionPolicy RemoteSigned
» E escolha a opção [A] Sim para Todos
✓ executa Get-ExecutionPolicy
Instalando NodeJS
• Windows
▪ Instalando o chocolatey
✓ Set-ExecutionPolicy Bypass -Scope Process -Force;
[System.Net.ServicePointManager]::SecurityProtocol =
[System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object
System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1’))
Fonte: https://docs.npmjs.com/cli/v6/commands/npm-run-script
Gerenciador de pacotes -Yarn
• Instalação
▪ npm install -g yarn
✓ yarn --version
Comandos doYarn
• Principais comandos:
▪ yarn -v. Checa a versão
▪ yarn init -y. Inicia um projeto criando o
package.json.
▪ yarn add nomePacote [-D]. Adiciona uma
dependência ao projeto. O D é opcional. indica que é
uma dependência de desenvolvimento
▪ yarn remove nomePacote. remove a depedência
do projeto
▪ yarn install ou yarn. instala todas as dependências
que estão na lista do package.json
fonte: https://yarnpkg.com/cli/init
API Rest
API Rest
Conceitos de API Rest
Conceitos de API Rest
Backend
Conceitos de API Rest
Conceitos de API Rest
Conceitos de API Rest
Backend javascripts frameworks
Biblioteca Express
• É o framework mais popular e a biblioteca
subjacente para uma série de outros
frameworks do Node.
• Oferece:
• Gerenciar requisições HTTP
• Definir as configurações da aplicação web,
• Ex: a porta para conexão.
• Adicionar novos processos de requisição por meio
de "middleware
Revisando o Express
Ferramentas auxiliares
• Insomnia ou Postman
▪ https://insomnia.rest/
▪ https://www.postman.com/
▪ https://hoppscotch.io/pt-br/
▪ Problemas
✓ Os drivers de BD são diferentes
– Mongo != Postgres
Banco de Dados
• Usando o próprio driver do BD
✓ Exemplo o Postgres
– https://node-postgres.com/
Banco de Dados
• As query Builders para javascript
▪ Um nível de abstração acima
✓ Escreve as queries usando funções,
– A biblioteca se encarrega de gerar a query nativa.
▪ Exemplo o Knex
✓ https://knexjs.org/
▪ Uso de migrations
Banco de Dados
• As query Builders para javascript
✓ Exemplo o Knex
– https://knexjs.org/
Banco de Dados
• ORM (Object-Relational Mapping)
▪ Nível mais alto de abstração
▪ Mapeamento objeto-relacional
✓ Feito por mapeador objeto-reacional
– uma biblioteca ou framework
▪ Exemplos
✓ Sequelize
– https://sequelize.org/master/
✓ typeORM
– https://typeorm.delightful.studio/
✓ Prisma
– https://www.prisma.io/
Banco de Dados
• ORM (Object-Relational Mapping)
–.
–.
Banco de Dados
• ORM (Object-Relational Mapping)
▪ No nodejs
✓ Padrão Active Record (Prisma)
✓ https://www.prisma.io/
–.
Banco de Dados
• ORM (Object-Relational Mapping)
▪ No nodejs
✓ Padrão Data Mapper (TypeORM)
✓ https://typeorm.io/
–.
Banco de Dados
• ORM (Object-Relational Mapping)
▪ No nodejs
✓ Padrão Active Record (TypeORM)
– https://typeorm.io/
–.
Projeto Backend
• Banco de dados
▪ Como escolher a melhor forma?
✓ Aquele que atende melhor o projeto
– No meu caso como professor
» Achei mais fácil de entender e aprender
Fonte: https://www.prisma.io/
Prisma
• Como o Prisma Funciona?
▪ Todo projeto começa com um arquivo Prisma Schema
✓ Permite que os desenvolvedores definam seus modelos
da aplicação
✓ Ele também contém a conexão com um banco de dados
e define um gerador.
▪ Portanto, nesse esquema configuramos 3 coisas:
✓ Data source: Especifica sua conexão com o banco de
dados (por meio de uma variável de ambiente)
✓ Generator: Indica que você deseja gerar o Prisma
Client
✓ Data model: Define seus modelos de aplicação
Fonte: https://www.prisma.io/docs/concepts/overview/what-is-prisma
Prisma
• Como o Prisma Funciona?
▪ Data Source (mongoDB)
Fonte: https://www.prisma.io/docs/concepts/database-connectors/mongodb
Prisma
• Como o Prisma Funciona?
Fonte: https://www.prisma.io/docs/concepts/overview/what-is-prisma
Prisma
• Instalando a extensão no VSCode
▪ Prisma
▪ Prisma – Insider
Fonte: https://www.prisma.io/docs/getting-started
Prisma
• Prisma CLI
▪ Puxe o esquema de um banco de dados
existente, atualizando o esquema Prisma)
✓ npx prisma db pull
▪ Envie o estado do esquema Prisma para o banco
de dados
✓ npx prisma db push
▪ Crie migrações do seu esquema Prisma, aplique-
as ao banco de dados, gere artefatos (por
exemplo, Prisma Client)
✓ npx prisma migrate dev
Fontes: https://www.prisma.io/docs/concepts/components/prisma-cli
https://www.prisma.io/docs/reference/api-reference/command-reference
Prisma
• Outros Prisma CLI
▪ npx prisma migrate reset
✓ Este comando exclui e recria o banco de dados
▪ npx prisma migrate deploy
✓ O comando aplica todas as migrações pendentes e cria
o banco de dados se ele não existir.
▪ npx prisma migrate resolve
✓ O comando permite que você resolva problemas de
histórico de migração na produção marcando uma
migração com falha como já aplicada (suporta linha de
base) ou revertida.
Fontes: https://www.prisma.io/docs/concepts/components/prisma-cli
https://www.prisma.io/docs/reference/api-reference/command-reference
Prisma
• Prisma CLI
▪ Configura um novo projeto Prisma
✓ npx prisma init --datasource-provider sqlite
Fontes: https://www.prisma.io/docs/concepts/components/prisma-cli
https://www.prisma.io/docs/reference/api-reference/command-reference
Prisma
• Definindo Model
Fontes: https://www.prisma.io/docs/concepts/components/prisma-schema/data-model
Relacionamento one to one
Relacionamento one to
many
Relacionamento many to many
Relacionamento many to many
Prisma
• Conhecendo o Prisma Studio
▪ Um Editor visual de dados do banco de dados
✓ Podemos manipular dados (inserções, remoções,
edições,..)
Fonte: https://www.prisma.io/docs/data-platform/data-browser
Prisma
• Conhecendo o Prisma Client
▪ Intuitivo Cliente de banco de dados para
typescript e nodejs
✓ De leituras simples a gravações aninhadas complexas,
o Prisma Client
– oferece suporte a uma ampla variedade de
operações no Banco de Dados
Fontes: https://www.prisma.io/client
Prisma
• Conhecendo o Prisma Client
▪ Instalação
✓ npm install @prisma/client ou yarn add @prisma/client
Fontes: https://www.prisma.io/docs/concepts/components/prisma-client
Projeto Exemplo
Projeto Exemplo
• Casos de usos
▪ Conta
✓ Autenticar cliente (cliente)
✓ Autenticar entregador (deliveryman) (alunos fazendo em
aula)
▪ Cliente
✓ Cadastrar cliente
✓ Buscar seus deliveries
▪ Deliveryman
✓ Cadastratar o entregador (alunos fazendo)
✓ Buscar todos os deliveries (alunos fazendo)
Projeto Exemplo
• Casos de usos
▪ Deliveries
✓ Cadastrar delivery
✓ Buscar deliveries sem data de entrega
✓ Atualizar o delivery com o entregador
✓ Atualizar a data final quando entregar o delivery
• Alunos podem fazer:
▪ Remoção de cliente, deliveryman, delivery.
▪ Buscar delivery pela data.
Projeto Exemplo
• Configurando
▪ yarn tsc --init
✓ Gerando o tsconfig.json
https://www.prisma.io/docs/getting-started/quickstart?query=tsconfig.json&page=1
▪ Package.json
Projeto Exemplo
• Iniciando as configurações do Prisma
▪ yarn prisma init --datasource-provider sqlite
2
Json Web Token - JWT
• É preciso informar:
▪ O token no header Authorization da
requisição
✓E, por convenção, após a palavra Bearer.
Usando o Token
• Usando o Token
Json Web Token - JWT
• Como é por dentro?
▪ Se o projeto Typescritp
✓yarn add @types/jsonwebtoken - D
Criptografar o password
• Utilizar a biblioteca de criptografia para o
password
Fonte: https://github.com/auth0/node-jsonwebtoken
Json Web Token - JWT
• Construção de um token (Primeiro)
▪ Criar um controlador para autenticação
– app.use(express.json())
» Para o server aceitar dados vindo da requisição no
formatod json
Tratando Exceções
• Duas formas
1. Usando o try-catch no controller
✓ trow new Error(“erro!”)
– Lançar uma exceção para o controller
– controller → Service (throw new Error())
Tratando Exceções
• Duas formas
2. Usando um middleware no server para tratar
os erros
✓ server→routes→controller→ use case (throw new Erro)
✓ Instalar a biblioteca express-async-erros
– yarn add express-async-errors
✓ Depois importar no server
– Logo depois da importação do express
Fonte: https://www.npmjs.com/package/express-async-errors
Fonte: https://www.npmjs.com/package/express-async-errors
Tratando Exceções
• Criando middleware para tratar exceções
Tratando Exceções
• Customizando Errors
▪ Criando uma classe Errors
✓ A fim de parametrizar os tipos de erros
– E instanciar essa classe no middleware que trata os erros
– E nos Services que lançam os erros com o throw
Criando middleware de
autenticação
• Passos
▪ Receber o token do aplicativo ou site web
✓ vamos configurar o insomnia para enviar o token
– Na aba Auth
» Seleciona Bearer token
Fonte: https://www.npmjs.com/package/multer
Fontes https://github.com/mscdex/busboy
Projeto Backend 2
• Upload de arquivos no disco
Fonte: https://www.npmjs.com/package/multer
Fontes https://github.com/mscdex/busboy
/
Projeto Backend 2
• Upload de arquivos no disco
▪ Instalando a biblioteca Multer
✓ yarn add multer
– Yarn add @types/multer
Fonte: https://www.npmjs.com/package/multer
/
Projeto Backend 2
• Upload de arquivos no disco
▪ Depois importamos a função multer
✓ Vai ser um middleware na rota post que faz o upload do
arquivo
– import multer from 'multer’;
▪ Importamos também o arquivo uploads.ts de
configuração
✓ E passar para a função multer
– const upload = multer(uploadConfig);
▪ Na rota post usamos o método array()
✓ Permitindo que o usuário faça upload de várias imagens
✓ app.post(‘/association', upload.array('images’), controller.handle);
– images é o nome do campus que vai receber as imagens
Projeto Backend 2
• Salvando arquivos no BD
▪ Com a entidade Imagem.ts tendo o
relacionamento com Association.ts
▪ No controller CreateAssociation.ts
✓ Pegamos as imagens
– request.files as Express.Multer.File[]
✓ depois criar um objeto contendo somente o filename
do arquivo (só queremos salvar o caminho)
– Podemos usar o map() de array
✓ Por fim, salvamos no banco
Projeto Backend 2
• Views dos dados
▪ Comos os dados vão está visíveis ou disponíveis
para o frontend.
✓ Neste projeto só estamos salvando o nome da imagem.
– No entanto, precisamos do formato do endereço
completo para passarmos a uma tag de visualização
» Img, Image,...
✓ Solução:
– Criamos uma pasta view dentro src
» EX: criamos images_view e association_view
» Formatarão os dados para nosso futuro frontend
✓ Configurar o Server para acessar a url de imagens
– app.use('/uploads', express.static(path.join(__dirname, '..',
'uploads')))
Projeto Backend 2
• Validações dos campos
▪ Instalar a biblioteca de esquema de validação yup
✓ yarn add yup @types/yup -D
✓ Importar, depois definir o schema epor fim validar
Fonte: https://github.com/jquense/yup
Projeto Backend 2
• Validações dos campos
▪ Foi criado uma pasta utils
✓ Contendo uma função que valida os campus
– Caso dê algum error lança para o middleware que
trata erros.
» Passando uma instanciação ValidationError do
Yup
» throw new ValidationError(error)
✓ Depois tratar os erros no middleware
Projeto Backend 2
• Permitindo que outras aplicações
acessem o servidor
▪ Instalar a biblioteca cors
✓ yarn add cors
– yarn add @types/cors -D