Express – Middlewares

Middlewares

O que são?

São quaisquer funções passadas de forma direta ou indireta para uma rota, recebendo até três parâmetros, sendo os dois primeiros o objeto de requisição e de resposta, respectivamente e o terceiro é uma callb…


This content originally appeared on DEV Community and was authored by Gabriel_Silvestre

Middlewares

O que são?

São quaisquer funções passadas de forma direta ou indireta para uma rota, recebendo até três parâmetros, sendo os dois primeiros o objeto de requisição e de resposta, respectivamente e o terceiro é uma callback que aciona o próximo Middleware.

** Middlewares que recebem quatro parâmetros são Middlewares de Erro e iremos aborda-los mais a frente.

O que faz?

Por serem funções, os Middlewares podem realizar diversas ações diferentes, tudo depende daquilo que queremos/precisamos fazer. Porém todo o Middleware sempre pode realizar essas três ações: manipular a requisição; enviar uma resposta; e/ou chamar o próximo middleware.

Sintaxe

Como vimos em sua definição, Middlewares são funções, que podem ser passadas direta ou indiretamente para a rota, a única diferença dos Middlewares para funções puras são os parâmetros recebidos.

Middlewares recebem por padrão três parâmetros, a requisição req, a resposta res e a referência ao próximo Middleware next.

function myMiddleware(req, res, next) {}
api.get(/*rota*/, myMiddleware);

const myMiddleware = (req, res, next) => {};
api.get(/*rota*/, myMiddleware);

app.get(/*rota*/, (req, res, next) => {});

Lembrando que não precisamos passar sempre uma arrow function como Middleware, podemos definir uma função previamente e passá-la como callback, sempre respeitando os parâmetros de um Middleware.

Middlewares Globais

O que são?

São funções que serão executadas antes, ou depois, de qualquer outro Middleware, sua ordem de execução depende diretamente do seu posicionamento no código.

O que fazem?

Middlewares globais normalmente são usados para autenticação, tratamento prévio dos dados e/ou tratamento de erros.

Sintaxe

Assim como qualquer Middleware, um global também é constituído de uma função de até três parâmetros, porém a diferença é que iremos chamar ele no app.use(), assim toda e qualquer rota definida abaixo do método .use() será executada somente após o Middleware global.

app.use((req, res, next) => {});

Valores entre Middlewares

Como fazer?

Para conseguirmos passar valores entre Middlewares, utilizamos o objeto de requisição req como um intermediário, dessa forma a chave que alterarmos/adicionarmos nesse objeto será refletida no próximo Middleware.

const firstMiddleware = (req, res, next) => {
  req.user = { name: 'usuario', password: 'abc123' };
  next();
};

Não passamos os valores através de parâmetros para a callback next(), pois caso passássemos, o próximo Middleware a ser chamado seria um Middleware de Erro e não um Middleware "comum".

Lembrando que a chave não precisa existir previamente no objeto.

Router

O que é?

É um método do Express que permite agrupar diversos endpoints em um único arquivo.

O que faz?

Permite a fragmentação das rotas em diversos arquivos, algo similar ao que ocorre no React com os componentes.

Sintaxe

Criação

Como o Router é um método que permite a fragmentação do código em diferentes arquivos, o primeiro passo é criar um novo arquivo para guardar os endpoints de determinada rota.

Com o arquivo criado, precisamos importar o Express e a partir dele gerar nosso router, para isso executamos o método .Router() do Express e armazenamos seu retorno em uma constante, convencionalmente chamada de router.

Tendo o router criado, a sintaxe de criação de endpoint segue a mesma, com a diferença que não usamos mais o objeto app, mas sim o router que criamos. Ao final da criação dos endpoints é necessário exportar somente o router.

// routes/myRouter.js

const express = require('express');
const router = express.Router();

myRoute.get('/', (req, res) => {});
myRoute.post('/', (req, res) => {});

module.exports = myRoute;

Uso

Para usarmos os endpoints criados em um arquivo externo é muito simples, em nosso arquivo principal (normalmente index.js) importamos o router criado no outro arquivo, para isso chamamos a função require() passando o path como parâmetro e armazenando seu retorno em uma constante, essa que pode receber qualquer nome.

Com o router contendo os endpoints importados, tudo que precisamos fazer é utilizar o método .use() passando dois parâmetros, o primeiro será a rota daqueles endpoints e o segundo o router que acabamos de importar.

// src/index.js

const myRouter = require('./myRouter');

app.use('/someRoute', myRouter);

Tratando Erros

Por que fazer?

Precisamos tratar o erro dentro da API, porque caso não o fizermos e a nossa aplicação quebrar, o erro irá aparecer de forma "crua" para o usuário, deixando nossa aplicação vulnerável.

Como fazer?

O tratamento de erros dentro do Express se dá através de Middlewares de Erros, esses que são similares aos outros que vimos até então, com uma única diferença, esse recebe quatro parâmetros obrigatórios.

Além dos três parâmetros base, req, res e next, também recebe o erro como primeiro argumento. Sendo assim, mesmo que não usemos os outros argumentos, é necessário passá-los, isso porque o Express identifica um Middleware de Erro a partir do número de parâmetros.

Sintaxe

Como visto anteriormente, o Middleware de erro precisa receber quatro parâmetros sendo eles o de erro err, o de requisição req, o de resposta res e o de chamada ao próximo next.

Além disso, esses Middlewares precisam ser definidos por último, a partir do método .use(). E para executá-los usamos a callback next(), passando um parâmetro para ela, dessa forma o Express sabe que o próximo Middleware a ser executado é para o tratamento de erros.

app.get(/*rota*/, (req, res, next) => {
  try {
    /*bloco de lógica*/
  } catch (err) {
    next(err)
  }
});

app.use((err, req, res, next) => {});

Express-rescue

O que é?

É um pacote externo do Node, disponível via NPM. Para instalar esse pacote basta utilizar o comando:

npm i express-rescue

O que faz?

Esse pacote facilita a escrita de Middlewares com tratamento de erro "embutido", dessa forma o código fica mais enxuto e legível.

Sintaxe

Após termos instalado o pacote, tudo que precisamos fazer é importá-lo e chamá-lo como Middleware do endpoint, passando uma callback como parâmetro, essa que irá receber os três parâmetros comuns aos Middlewares (req, res e next).

const rescue = require('express-rescue');

app.get('/', rescue((req, res, next) => {}));


This content originally appeared on DEV Community and was authored by Gabriel_Silvestre


Print Share Comment Cite Upload Translate Updates
APA

Gabriel_Silvestre | Sciencx (2022-03-17T22:24:38+00:00) Express – Middlewares. Retrieved from https://www.scien.cx/2022/03/17/express-middlewares-2/

MLA
" » Express – Middlewares." Gabriel_Silvestre | Sciencx - Thursday March 17, 2022, https://www.scien.cx/2022/03/17/express-middlewares-2/
HARVARD
Gabriel_Silvestre | Sciencx Thursday March 17, 2022 » Express – Middlewares., viewed ,<https://www.scien.cx/2022/03/17/express-middlewares-2/>
VANCOUVER
Gabriel_Silvestre | Sciencx - » Express – Middlewares. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2022/03/17/express-middlewares-2/
CHICAGO
" » Express – Middlewares." Gabriel_Silvestre | Sciencx - Accessed . https://www.scien.cx/2022/03/17/express-middlewares-2/
IEEE
" » Express – Middlewares." Gabriel_Silvestre | Sciencx [Online]. Available: https://www.scien.cx/2022/03/17/express-middlewares-2/. [Accessed: ]
rf:citation
» Express – Middlewares | Gabriel_Silvestre | Sciencx | https://www.scien.cx/2022/03/17/express-middlewares-2/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.