Middlewares
O que são Middlewares em Express.js?
Middlewares no Express.js são funções que atuam no ciclo de pedido e resposta das aplicações web. Essas funções recebem três parâmetros principais: o objeto do pedido (req), o objeto de resposta (res) e a função next(). O middleware pode executar qualquer código, modificar os objetos req e res, encerrar a resposta ou passar o controle para o próximo middleware chamando next().
Na prática, middlewares funcionam como etapas intermediárias que processam o pedido HTTP desde o momento em que ele chega até o momento em que a resposta é enviada para o cliente. Eles são essenciais para adicionar funcionalidades modulares, como autenticação, logging, manipulação de erros e muito mais, permitindo manter o código organizado e reutilizável.
Tipos de Middlewares
- Middleware de Aplicação: Aplicado a todas ou várias rotas da aplicação. Exemplo:
app.use(). - Middleware de Rota: Específico para uma rota ou grupo de rotas.
- Middleware Integrado: Fornecido pelo próprio Express (ex:
express.json(),express.static()). - Middleware de Terceiros: Bibliotecas externas instaladas via npm, como
morgan(logging) oucors(controle de acesso).
Como Funciona o Fluxo de Middlewares?
Quando um pedido chega, o Express passa esse pedido por uma cadeia sequencial de middlewares. Cada middleware pode realizar alguma ação e, para que o processamento continue, deve chamar next(). Se um middleware não chamar next() e não encerrar a resposta, o pedido fica “preso” e não chega na rota final.
Criar Middlewares Customizados no Express.js
Exemplo 1: Middleware Simples de Logging
const express = require('express');
const app = express();
// Middleware que registra o método HTTP e a URL do pedido
function logger(req, res, next) {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next(); // Chama o próximo middleware ou rota
}
app.use(logger); // Middleware global para todas as rotas
app.get('/', (req, res) => {
res.send('Olá, mundo!');
});
app.listen(3000, () => {
console.log('Servidor rodando na porta 3000');
});
Esse middleware simplesmente registra no console o tipo de requisição e o caminho acessado, e depois chama next() para continuar o fluxo.
Exemplo 2: Middleware de Autenticação Simples
function autenticar(req, res, next) {
const token = req.header('Authorization');
if (!token) {
return res.status(401).send('Acesso negado. Token não fornecido.');
}
// Aqui você poderia validar o token (ex: JWT)
try {
// Suponha que a validação do token foi feita aqui
next(); // Continua para a próxima etapa
} catch (erro) {
res.status(400).send('Token inválido.');
}
}
app.use('/protegido', autenticar);
app.get('/protegido', (req, res) => {
res.send('Conteúdo protegido acessado com sucesso.');
});
Esse middleware verifica se o cabeçalho Authorization está presente e, caso negativo, encerra a requisição com erro 401. Caso esteja presente, o fluxo continua.
Exemplo 3: Middleware para Adicionar Informação ao Pedido
function addRequestTime(req, res, next) {
req.requestTime = Date.now();
next();
}
app.use(addRequestTime);
app.get('/time', (req, res) => {
res.send(`Hora da requisição: ${new Date(req.requestTime).toLocaleString()}`);
});
Esse middleware adiciona uma propriedade requestTime ao objeto req para ser usada nas rotas seguintes.
Como Usar Middlewares em Rotas Específicas?
Você pode aplicar middlewares apenas em rotas específicas passando-os como primeiro parâmetro:
app.get('/rota', middlewareExemplo, (req, res) => {
res.send('Rota com middleware específico');
});
Resumo e Dicas
- Middlewares são blocos de código que processam requisições e respostas em Express.js.
- Podem executar ações como logging, autenticação, manipulação de dados.
- Sempre chame
next()ao final do middleware para que o processamento continue, a menos que queira finalizar a resposta. - São configuráveis globalmente (
app.use()) ou para rotas específicas. - Use middlewares para separar responsabilidades e deixar o código mais organizado e modular.
Essa estrutura básica já permite criar middlewares poderosos para qualquer aplicação Express.js, facilitando a manutenção e a adição de funcionalidades rapidamente.
