Você está na página 1de 23

Programação Bakend com

NodeJS

Middleware

Prof. Mr. Fabio Abrantes Diniz


fabio.abrantes.diniz@gmail.com
Características do Express
• Middleware: O fluxo da requisição passa uma por
única função; no Express temos uma pilha de
middleware, que na prática é um vetor de funções

• Roteamento: roteadores são como middleware,


mas ativadas somente a partir de um método HTTP
específico (GET, POST)

• Extensões para os objetos de requisição de


resposta: adiciona uma porção de novos métodos e
propriedades a esses objetos
Introdução a funções de
middleware
• Middleware permite que, em vez de utilizar uma
única função enorme para lidar com todas as
requisições, o atendimento às requisições seja
dividido em funções menores
▪ Geralmente atendem a um aspecto por vez:
✓ uma função para logging,
✓ outra para interpretar valores especiais de requisições,
✓ outra para autenticar usuários.
✓ Verificar o token
✓ ...
Middleware

• Função de manipulação de requisição


(request handler) do Node, mas em vez de
uma, temos várias em sequência

• Usados para várias coisas:


▪ Um middleware faz registro de logging
▪ Outro adiciona cabeçalhos especiais à requisição
▪ etc.
Funcionamento de middleware
Funcionamento de middleware
Node sem Express – uma única
função
• Node irá receber requisições, interpretá-las e
transformá-las em objetos JavaScript: um
para a requisição e outro para a resposta
HTTP.
▪ Esses dois objetos serão passados para a função
JavaScript que o programador escreverá
Express e a pilha de middleware

• No Express, os objetos são decorados com


alguns utilitários e passados por uma pilha de
funções
Assinatura de uma função de
middleware
• function(request, response, next)

• O terceiro parâmetro é uma função que


chama o próximo middleware da pilha

• Em qualquer middleware da pilha, deve


haver uma única chamada a
▪ response.end (ou funções do Express) para
finalizar a requisição
Roteamento

• Roteamento no Express consiste em mapear


URL a manipuladores de requisição
específicos no servidor

• Por exemplo:
▪ Homepage
▪ About
▪ 404
▪ Etc.
Estendendo requisição e resposta

• O Express aumenta as propriedades e as


funções dos objetos da requisição e da
resposta

• Útil para:
▪ Enviar arquivos ao cliente
▪ Gerar respostas com cabeçalhos mais rapidamente
▪ Etc.
Projeto Backend
• Modificação nas Rotas e server
▪ Utilizando Middleware no server
✓ O que são?
– todo o tipo de função que está entre um pedido HTTP
e a resposta final
» que o servidor envia de volta para o cliente.
Projeto Backend
• Modificação nas Rotas e server
▪ Utilizando Middleware no server
✓ Portanto são funções
– Recebe 4 parâmetros
» Error, Request, Response e next()
✓ Podem executar as seguintes tarefas
– Executar qualquer código.
» autenticação
– Fazer mudanças nos objetos de solicitação e
resposta.
– Encerrar o ciclo de solicitação-resposta.
» Ex: exceções
– Chamar o próximo middleware na pilha.
Projeto Backend
• Modificação nas Rotas e server
▪ Utilizando Middleware no server
✓ Usamos middleware para usar o arquivo router e json()
– app.use(router)
» Adicionar as rotas

– app.use(express.json())
» Para o server aceitar dados vindo da requisição no
formatod json
Middleware de erros

• Existe um segundo tipo de middleware, menos


utilizado, que são as funções de manipulação
de erros
• Para entrar em modo de erro algum
middleware da pilha deve chamar next com o
um argumento de erro:
▪ Next(new Error('Algo deu errado'))
• Em vez de três parâmetros, esse tipo de
middleware tem quatro, sendo o primeiro o
objeto de erro
Middleware de erros
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

▪ No Middleware, capturamos o token pela


requisição
✓ request.headers.authorization

▪ Validar se token está preenchido


✓ Se não tive mandar uma resposta de erro
Criando middleware de
autenticação
• Passos
▪ Retirar o Bearer
✓ Formato:
– Bearer u5943u55u6ortmlkgmvkxciyd903489500898

▪ Verificar se o token é válido (dentro trycatch)


✓ Usar o método verify(token, secretKey) da lib
jsonwebtoken
– Retorna o payload
Criando middleware de
autenticação
• Passos
▪ Adicionar informações a Requisição (Request)
✓ Ex: inserir o subject contendo o id do usuário do payload
– request.user_id = sub;
✓ Se tudo ocorrer bem o midleware permite o controller
sua função
– Usando o next()

▪ No typescript é necessário configurações


✓ Criar uma pasta na src chamado @types/express
– Contendo um arquivo chamado index.d.ts
✓ no arquivo tsconfig.json
– habilito "typeRoots": ["./src/@types"],

Você também pode gostar