Neste artigo você vai aprender:
- O que é e como funciona o framework Express.
- O que são e como utilizar middlewares no Express.
- Como funciona o ciclo request-response.
Entendendo o que é o Express
O Express é um dos frameworks mais populares do universo Node.js. Basicamente ele é um framework web que auxilia o desenvolvimento de APIs, gerenciando requisições HTTP, e também auxilia a criação de servidores web a partir do uso de middlewares.
Mas o que é um middleware?
Segundo a definição da empresa RedHat, middleware é “um software que fornece serviços e recursos comuns a aplicações”. Ainda de acordo com a RedHat, com o middleware, “os desenvolvedores podem criar aplicações com mais facilidade e eficiência, pois esse tipo de software tem o papel de conectar aplicações, dados e usuários”.
Ou seja, um middleware é uma aplicação que vai auxiliar outra aplicação a realizar alguma tarefa. No caso de uma aplicação desenvolvida utilizando o Express, ela é composta por uma séeeerie de middlewares, como se estivéssemos montando um Lego, encaixando várias pecinhas que se comunicam umas com as outras.
E como utilizar middlewares no Express?
O Express mantém uma série de middlewares, cada qual com o seu objetivo. Há middleware para manipulação de erros, para trabalhar com sessões de usuário, parâmetros de URL, dentre outros. Você pode encontrar a lista completa dos middlewares mantidos pela equipe do Express no próprio site deles.
Como o objetivo principal do Express é auxiliar o desenvolvimento de APIs, os middlewares nele são funções que têm acesso ao objeto request, ao objeto response e ao middleware next. Ou seja, em qualquer parte do seu código que você esteja usando um middleware Express, você terá acesso a esses objetos.
O objeto request corresponde a uma requisição feita e o objeto response corresponde a resposta dada a essa requisição.
Para ilustrar, vamos ver esse trecho de código:
var express = require('express') var app = express() app.get('/', function (req, res, next) { res.send('Hello World!') }) app.listen(3000)
Neste trecho de código, app é uma aplicação Express que pode ser acessada no endereço http://localhost:3000. Toda vez que essa aplicação receber uma requisição HTTP GET no endereço ” / “, aquela função middleware vai responder com uma mensagem “Hello World”.
O Ciclo Request-Response
Uma aplicação Express é construída seguindo este formato e lógica, em que há funções middlewares para receber e responder requisições. Deste modo, o Express funciona de acordo com o ciclo “request-response”. O ciclo se inicia quando uma requisição é recebida e ele só se encerra quando ela é respondida. Se o middleware que recebe a requisição não respondê-la, ou seja, não encerrar o ciclo “request-response”, ele deve chamar a função “next()” para passar o controle para o próximo middleware, caso contrário, a requisição ficará presa alí.
Veja o exemplo a seguir:
var express = require('express') var app = express() //middleware que loga a mensagem "LOGGED" var myLogger = function (req, res, next) { console.log('LOGGED') next() } //define que o middleware myLogger deve ser utilizado app.use(myLogger) app.get('/', function (req, res) { res.send('Hello World!') }) app.listen(3000)
Neste exemplo temos o middleware “myLogger”. Este middleware apenas loga a mensagem “LOGGED” toda vez que uma requisição passa por ele. Como ele não apresenta uma resposta a requisição, ele usa a função next() para passar a responsabilidade para o próximo middleware.
Se quiser testar o exemplo, basta seguir o passo-a-passo do post anterior para criar uma aplicação utilizando Express.
Você deve ter reparado que, diferente da função “app.get()”, a função “myLogger” não tem nenhum endereço definido para o qual ela deva responder. Quando isso acontece, o endereço padrão definido pelo próprio Express é a ” / “. Logo, toda vez que uma requisição ao endereço ” / ” for feita, serão realizadas duas ações: a mensagem “LOGGED” será logada e a mensagem “Hello World” será respondida a quem fez a requisição.
Um fato importante sobre o Express é que os middlewares são executados sequencialmente, ou seja, de acordo com a ordem em que foram definidos no código. Devido a este comportamento que a função “myLogger” foi executada antes de “app.get()”.
E se trocarmos a ordem em que esses middlewares aparecem no código? Muda alguma coisa?
var express = require('express') var app = express() //middleware que loga a mensagem "LOGGED" var myLogger = function (req, res, next) { console.log('LOGGED') next() } app.get('/', function (req, res) { res.send('Hello World!') }) //define que o middleware myLogger deve ser utilizado app.use(myLogger) app.listen(3000)
Bom, como os middlewares são executados sequencialmente e a função “app.get()” apresenta uma resposta a requisição, o middleware “myLogger” nunca será executado, pois o ciclo “request-response” terá sido encerrado.
Bom, era isso que eu queria trazer para vocês neste artigo.
Qualquer dúvida, sugestão ou feedback, basta deixar um comentário!
Até o próxima!
Muito bom 🙂
Obrigada! Fico feliz que tenha gostado!