Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
March 17, 2022 10:24 pm GMT

Express - Middlewares

Middlewares

O que so?

So quaisquer funes passadas de forma direta ou indireta para uma rota, recebendo at trs parmetros, sendo os dois primeiros o objeto de requisio e de resposta, respectivamente e o terceiro uma callback que aciona o prximo Middleware.

** Middlewares que recebem quatro parmetros so Middlewares de Erro e iremos aborda-los mais a frente.

O que faz?

Por serem funes, os Middlewares podem realizar diversas aes diferentes, tudo depende daquilo que queremos/precisamos fazer. Porm todo o Middleware sempre pode realizar essas trs aes: manipular a requisio; enviar uma resposta; e/ou chamar o prximo middleware.

Sintaxe

Como vimos em sua definio, Middlewares so funes, que podem ser passadas direta ou indiretamente para a rota, a nica diferena dos Middlewares para funes puras so os parmetros recebidos.

Middlewares recebem por padro trs parmetros, a requisio req, a resposta res e a referncia ao prximo 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 no precisamos passar sempre uma arrow function como Middleware, podemos definir uma funo previamente e pass-la como callback, sempre respeitando os parmetros de um Middleware.

Middlewares Globais

O que so?

So funes que sero executadas antes, ou depois, de qualquer outro Middleware, sua ordem de execuo depende diretamente do seu posicionamento no cdigo.

O que fazem?

Middlewares globais normalmente so usados para autenticao, tratamento prvio dos dados e/ou tratamento de erros.

Sintaxe

Assim como qualquer Middleware, um global tambm constitudo de uma funo de at trs parmetros, porm a diferena que iremos chamar ele no app.use(), assim toda e qualquer rota definida abaixo do mtodo .use() ser executada somente aps o Middleware global.

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

Valores entre Middlewares

Como fazer?

Para conseguirmos passar valores entre Middlewares, utilizamos o objeto de requisio req como um intermedirio, dessa forma a chave que alterarmos/adicionarmos nesse objeto ser refletida no prximo Middleware.

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

No passamos os valores atravs de parmetros para a callback next(), pois caso passssemos, o prximo Middleware a ser chamado seria um Middleware de Erro e no um Middleware "comum".

Lembrando que a chave no precisa existir previamente no objeto.

Router

O que ?

um mtodo do Express que permite agrupar diversos endpoints em um nico arquivo.

O que faz?

Permite a fragmentao das rotas em diversos arquivos, algo similar ao que ocorre no React com os componentes.

Sintaxe

Criao

Como o Router um mtodo que permite a fragmentao do cdigo 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 mtodo .Router() do Express e armazenamos seu retorno em uma constante, convencionalmente chamada de router.

Tendo o router criado, a sintaxe de criao de endpoint segue a mesma, com a diferena que no usamos mais o objeto app, mas sim o router que criamos. Ao final da criao dos endpoints necessrio exportar somente o router.

// routes/myRouter.jsconst 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 funo require() passando o path como parmetro 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 mtodo .use() passando dois parmetros, o primeiro ser a rota daqueles endpoints e o segundo o router que acabamos de importar.

// src/index.jsconst myRouter = require('./myRouter');app.use('/someRoute', myRouter);

Tratando Erros

Por que fazer?

Precisamos tratar o erro dentro da API, porque caso no o fizermos e a nossa aplicao quebrar, o erro ir aparecer de forma "crua" para o usurio, deixando nossa aplicao vulnervel.

Como fazer?

O tratamento de erros dentro do Express se d atravs de Middlewares de Erros, esses que so similares aos outros que vimos at ento, com uma nica diferena, esse recebe quatro parmetros obrigatrios.

Alm dos trs parmetros base, req, res e next, tambm recebe o erro como primeiro argumento. Sendo assim, mesmo que no usemos os outros argumentos, necessrio pass-los, isso porque o Express identifica um Middleware de Erro a partir do nmero de parmetros.

Sintaxe

Como visto anteriormente, o Middleware de erro precisa receber quatro parmetros sendo eles o de erro err, o de requisio req, o de resposta res e o de chamada ao prximo next.

Alm disso, esses Middlewares precisam ser definidos por ltimo, a partir do mtodo .use(). E para execut-los usamos a callback next(), passando um parmetro para ela, dessa forma o Express sabe que o prximo Middleware a ser executado para o tratamento de erros.

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

Express-rescue

O que ?

um pacote externo do Node, disponvel 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 cdigo fica mais enxuto e legvel.

Sintaxe

Aps termos instalado o pacote, tudo que precisamos fazer import-lo e cham-lo como Middleware do endpoint, passando uma callback como parmetro, essa que ir receber os trs parmetros comuns aos Middlewares (req, res e next).

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

Original Link: https://dev.to/gabrielhsilvestre/express-middlewares-2oha

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To