¡Ven a la JSConf España 2026! Comprar entradas

Middleware para parsear el body de las peticiones

En esta clase resolvemos un problema técnico fundamental: cómo leer los datos enviados por el cliente en el cuerpo (body) de una petición POST, PUT o PATCH.

Hasta ahora ya teníamos un CRUD básico funcionando, pero nos faltaba una pieza clave para trabajar cómodamente con los datos que nos llegan desde el exterior.

El problema: req.body es undefined

Si intentas acceder al cuerpo de una petición en una instalación limpia de Express, te encontrarás con una sorpresa:

app.post('/jobs', (req, res) => {
  console.log(req.body) // 👈 undefined
})

Esto ocurre porque Express, por diseño, es minimalista y no parsea el cuerpo de las peticiones de forma automática. No sabe si lo que le llega es un JSON, un formulario de texto o un archivo binario.

La solución: el middleware express.json()

Para solucionar esto, Express incluye un middleware listo para usar que se encarga de todo el trabajo sucio por nosotros. Este middleware:

  1. Escucha el flujo de datos (stream) que llega al servidor.
  2. Detecta si el contenido es JSON (mirando la cabecera Content-Type).
  3. Parsear el JSON automáticamente.
  4. Inyecta el resultado en el objeto req.body.

Cómo registrar el middleware

Para que funcione en todas nuestras rutas, debemos registrarlo usando app.use() antes de definir nuestros endpoints:

import express from 'express'

const app = express()

// Registramos el middleware globalmente
app.use(express.json())

app.post('/jobs', (req, res) => {
  // Ahora req.body ya contiene los datos parseados
  const { title, company } = req.body
  return res.status(201).json({ title, company })
})

app.listen(1234)

Creando un recurso con datos reales

Ahora que tenemos acceso al body, nuestro endpoint de creación de empleos se vuelve mucho más potente y legible:

app.post('/jobs', (req, res) => {
  // Extraemos los datos del body enviado por el cliente
  const { title, company, location } = req.body

  const newJob = {
    id: crypto.randomUUID(), // Generamos un ID único y seguro
    title,
    company,
    location
  }

  jobs.push(newJob)

  return res.status(201).json(newJob)
})

¿Por qué esto es mejor que Node.js nativo?

Si recordamos cómo lo hacíamos con el módulo http nativo, el cambio es drástico:

  • En nativo: Teníamos que escuchar eventos 'data', acumular buffers, escuchar el evento 'end', manejar errores de parsing y convertir manualmente con JSON.parse().
  • En Express: Una sola línea (app.use(express.json())) hace todo eso de forma segura y eficiente.

Lo que hemos aprendido

  • ✅ Express no parsea el cuerpo de las peticiones por defecto.
  • express.json() es el middleware estándar para manejar datos en formato JSON.
  • ✅ Al registrarlo con app.use(), simplificamos drásticamente el código de nuestros endpoints.
  • req.body se convierte en nuestra puerta de entrada para recibir información del cliente.

En la siguiente clase aprenderemos a proteger nuestra API validando que los datos que nos llegan en el body sean exactamente los que esperamos.