3 interessantes maneiras de se utilizar melhor os middlewares do express
Tags: node, express, middlewares, javascript
Published: 2021-05-11 01:59:56

Atualmente, express.js é um dos frameworks mais utilizados em aplicações node.js.
Sua documentação e facilidade de iniciar um servidor, tornam ele um must have de todo desenvolvedor node.
No entanto, é comum que muitas possibilidades e alternativas acabem passando desapercebidas no momento que estamos desenvolvendo.
E esse é o foco desse artigo: Aprofundar os conhecimentos nos middlewares utilizando express.

#Iniciando o projeto#
Você vai precisar instalar [node](https://nodejs.org/en/download/) em sua máquina e em seguida criar um projeto utilizando [npm](https://www.npmjs.com/get-npm) ou [yarn](https://classic.yarnpkg.com/en/docs/install)

Escolha uma pasta e dentro dela, via terminal:

*npm init -y* ou *yarn init -y*

#Instalando dependências#

Vamos instalar o express e o morgan como dependências do projeto.

*npm install express morgan --save*

Crie um arquivo index.js e cole o seguinte código:

{% gist https://gist.github.com/sousacaio/818d80684e5f693bea00195d1f111cb2 %}
No seu terminal,dê um *node index.js* e, no navegador, acesse [localhost:3000](localhost:3000).
Faça isso para todos os arquivos que iremos criar a partir desse momento- não esqueça de prestar atenção aos endpoints das rotas!!!

Esse é o uso básico. Dessa maneira conseguimos criar um servidor com poucas linhas. No entanto, podemos fazer ainda mais.

Segundo a própria documentação sobre middlewares: "**um aplicativo express é uma série de chamadas de funções de middleware**"

Isso significa que podemos manipular os objetos [req](https://expressjs.com/pt-br/api.html#req) e [res](https://expressjs.com/pt-br/api.html#res) antes de passar os dados da requisição para o próximo middleware:

{% gist https://gist.github.com/sousacaio/29b645519429ad0fb80069c77bdcfa34 %}

Essa possibilidade de customização é a base do nosso artigo.

Podemos alterar variáveis e até mesmo criar novas, passando funções e valores que ficam disponíveis globalmente, inclusive.

Novidade isso não é, uma vez que iniciando um app express, geralmente utilizamos recursos como loggers:

{% gist https://gist.github.com/sousacaio/4a949e460b049858e146f2c9d3ac665f %}

No início do arquivo declaramos o [morgan](https://www.npmjs.com/package/morgan) e dois routers.

O morgan tem o trabalho de nos mostrar as requisições que chegam, interceptando o objeto req e nos mostrando os dados, dando possibilidade de até um certo nível de customização.

Já no router1, adicionamos ao objeto req a chave *propriedade*, ou seja, estamos dizendo ao aplicativo que toda e qualquer rota que estiver dentro desse *Router* receberá o valor de propriedade.

Já ao acessar o router2, não conseguimos printar o conteúdo de propriedade pois essa variável não existe dentro desse contexto de roteamento.

#Possíveis usos:#

##1 - Sistema de log:##
Esse uso é bem simplório, mas efetivo.
Basicamente passamos uma função para o nosso router principal(ou raiz)
Essa função poderia ser qualquer coisa. Desde salvar dados no banco a trazer dados do banco, por exemplo. No entanto, será utilizada para fins de log.

{% gist https://gist.github.com/sousacaio/8e85c17f8dac183170153654c12b00a1 %}

##2 -Sistema de permissão##
O uso nesse caso é um tipo de permissão estática.
Caso você acesse a rota /proibido, não irá conseguir ver o conteúdo. A propriedade isAdmin tem o valor false, logo, o middleware entende que não vai ser possível passar para o próximo .
{% gist https://gist.github.com/Shouganaii/5675d8f0eb491f92c9dfe116e71abe62 %}

##3 - Uso interno de eventos(Event emmiters)##
O uso de eventos é de uso mais intermediário dentro da comunidade do node. No entanto, caso a sua aplicação seja event-driven e você necessite desencadear uma ação que o gatilho esteja dentro de alguma rota, esse é o caminho.
{% gist https://gist.github.com/sousacaio/e41c10b47bb922d5967325928280a672 %}

#Cuidado#

O uso desses middlewares pode significar um tipo de injeção de dependências dentro dos controllers do sistema. De um ponto de vista arquitetural, eles podem deixar seus módulos mais acoplados que o necessário, deixando o código mais suscetível a falhas. O recomendado nesse caso é sempre deixar o seu código o mais testado possível, diminuindo as chances de causar problemas generalizados

#Github#
O repositório com todos os exemplos de códigos acima:
https://github.com/sousacaio/artigo-middleware-express

#Conclusão#
Middlewares podem ser muito úteis. Eles permitem uma gama de variedades dentro de cada contexto de roteamento do seu sistema, dependendo da necessidade, claro. Espero que esse tutorial tenha te ajudado a entender o que eles são e como utilizá-los.

Se você chegou até aqui, fique a vontade para contribuir e obrigado pela leitura!