An Interest In:
Web News this Week
- March 22, 2024
- March 21, 2024
- March 20, 2024
- March 19, 2024
- March 18, 2024
- March 17, 2024
- March 16, 2024
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
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To