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:
- Escucha el flujo de datos (stream) que llega al servidor.
- Detecta si el contenido es JSON (mirando la cabecera
Content-Type). - Parsear el JSON automáticamente.
- 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 conJSON.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.bodyse 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.