Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Criando Middleware Personalizado | Desenvolvimento de Aplicações Web com Express.js
Desenvolvimento Backend com Node.js e Express.js

Criando Middleware Personalizado

Deslize para mostrar o menu

No Express.js, é possível criar funções de middleware personalizadas utilizando o método app.use(). Essas funções recebem três parâmetros: req (o objeto de requisição), res (o objeto de resposta) e next (uma função para passar o controle para o próximo middleware na cadeia). O middleware personalizado pode ser aplicado globalmente a todas as rotas ou a rotas específicas, especificando um caminho de rota.

Criando Middleware Personalizado

Exemplo básico de uma função de middleware personalizada que registra o timestamp e a URL de cada requisição recebida:

app.use((req, res, next) => {
  const timestamp = new Date().toISOString();
  const url = req.url;
  
  console.log(`[${timestamp}] ${url}`);
  
  next(); // Pass control to the next middleware.
});

Neste exemplo, o middleware personalizado registra o timestamp e a URL de cada requisição recebida no console. A função next() é chamada para passar o controle ao próximo middleware no pipeline.

Exemplo Prático: Combinando Middleware Nativo e Personalizado

Exemplo prático utilizando um middleware nativo do Express para analisar dados JSON e, em seguida, criando um middleware personalizado para validar esses dados antes de prosseguir:

const express = require('express');
const app = express();

// Use built-in middleware to parse JSON data.
app.use(express.json());

// Custom middleware to validate JSON data.
app.use((req, res, next) => {
  const jsonData = req.body;

  if (!jsonData || Object.keys(jsonData).length === 0) {
    // If the JSON data is missing or empty, send an error response.
    return res.status(400).json({ error: 'Invalid JSON data' });
  }

  // Data is valid; proceed to the next middleware or route.
  next();
});

// Route that expects valid JSON data.
app.post('/api/data', (req, res) => {
  const jsonData = req.body;
  res.status(200).json({ message: 'Data received', data: jsonData });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000.');
});

Neste exemplo:

  • Utiliza-se o middleware nativo express.json() para analisar os dados JSON recebidos;
  • Cria-se um middleware personalizado que verifica se os dados JSON analisados estão ausentes ou vazios. Se estiverem, envia uma resposta 400 Bad Request com uma mensagem de erro. Se os dados forem válidos, chama next() para prosseguir para a rota;
  • A rota /api/data espera dados JSON válidos. Se o middleware personalizado validar os dados, o manipulador da rota os recebe e envia uma resposta de sucesso.
Descrição do código
expand arrow
  • Linha 1: importa o framework Express.js;

  • Linha 2: cria uma instância da aplicação Express ao chamar express(). O objeto app resultante é utilizado para definir rotas, middlewares e manipular requisições HTTP;

  • Linha 5: ativa o middleware interno express.json(). Esse middleware analisa automaticamente os corpos de requisições JSON recebidas e disponibiliza os dados através de req.body;

  • Linhas 8-18: definem um middleware personalizado utilizado para validar dados JSON recebidos;

  • verifica se req.body contém dados;

  • retorna uma resposta 400 Bad Request se o corpo da requisição estiver ausente ou vazio;

  • chama next() se os dados JSON forem válidos e continua para o próximo middleware ou manipulador de rota;

  • Linhas 21-24: definem uma rota POST em /api/data;

  • recupera os dados JSON enviados a partir de req.body;

  • retorna uma resposta 200 OK contendo uma mensagem de confirmação e os dados recebidos;

  • Linhas 26-28: inicia a aplicação Express e começa a escutar requisições na porta 3000.

Este exemplo demonstra como é possível utilizar tanto middlewares internos quanto personalizados para validar dados antes que eles cheguem aos manipuladores de rota, garantindo que os dados estejam no formato esperado antes de serem processados.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 9

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Criando Middleware Personalizado

No Express.js, é possível criar funções de middleware personalizadas utilizando o método app.use(). Essas funções recebem três parâmetros: req (o objeto de requisição), res (o objeto de resposta) e next (uma função para passar o controle para o próximo middleware na cadeia). O middleware personalizado pode ser aplicado globalmente a todas as rotas ou a rotas específicas, especificando um caminho de rota.

Criando Middleware Personalizado

Exemplo básico de uma função de middleware personalizada que registra o timestamp e a URL de cada requisição recebida:

app.use((req, res, next) => {
  const timestamp = new Date().toISOString();
  const url = req.url;
  
  console.log(`[${timestamp}] ${url}`);
  
  next(); // Pass control to the next middleware.
});

Neste exemplo, o middleware personalizado registra o timestamp e a URL de cada requisição recebida no console. A função next() é chamada para passar o controle ao próximo middleware no pipeline.

Exemplo Prático: Combinando Middleware Nativo e Personalizado

Exemplo prático utilizando um middleware nativo do Express para analisar dados JSON e, em seguida, criando um middleware personalizado para validar esses dados antes de prosseguir:

const express = require('express');
const app = express();

// Use built-in middleware to parse JSON data.
app.use(express.json());

// Custom middleware to validate JSON data.
app.use((req, res, next) => {
  const jsonData = req.body;

  if (!jsonData || Object.keys(jsonData).length === 0) {
    // If the JSON data is missing or empty, send an error response.
    return res.status(400).json({ error: 'Invalid JSON data' });
  }

  // Data is valid; proceed to the next middleware or route.
  next();
});

// Route that expects valid JSON data.
app.post('/api/data', (req, res) => {
  const jsonData = req.body;
  res.status(200).json({ message: 'Data received', data: jsonData });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000.');
});

Neste exemplo:

  • Utiliza-se o middleware nativo express.json() para analisar os dados JSON recebidos;
  • Cria-se um middleware personalizado que verifica se os dados JSON analisados estão ausentes ou vazios. Se estiverem, envia uma resposta 400 Bad Request com uma mensagem de erro. Se os dados forem válidos, chama next() para prosseguir para a rota;
  • A rota /api/data espera dados JSON válidos. Se o middleware personalizado validar os dados, o manipulador da rota os recebe e envia uma resposta de sucesso.
Descrição do código
expand arrow
  • Linha 1: importa o framework Express.js;

  • Linha 2: cria uma instância da aplicação Express ao chamar express(). O objeto app resultante é utilizado para definir rotas, middlewares e manipular requisições HTTP;

  • Linha 5: ativa o middleware interno express.json(). Esse middleware analisa automaticamente os corpos de requisições JSON recebidas e disponibiliza os dados através de req.body;

  • Linhas 8-18: definem um middleware personalizado utilizado para validar dados JSON recebidos;

  • verifica se req.body contém dados;

  • retorna uma resposta 400 Bad Request se o corpo da requisição estiver ausente ou vazio;

  • chama next() se os dados JSON forem válidos e continua para o próximo middleware ou manipulador de rota;

  • Linhas 21-24: definem uma rota POST em /api/data;

  • recupera os dados JSON enviados a partir de req.body;

  • retorna uma resposta 200 OK contendo uma mensagem de confirmação e os dados recebidos;

  • Linhas 26-28: inicia a aplicação Express e começa a escutar requisições na porta 3000.

Este exemplo demonstra como é possível utilizar tanto middlewares internos quanto personalizados para validar dados antes que eles cheguem aos manipuladores de rota, garantindo que os dados estejam no formato esperado antes de serem processados.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 9
some-alt