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

Creando un CRUD con Express

En esta clase damos un paso clave en el desarrollo backend: construimos un CRUD completo usando Express.

CRUD es el acrónimo de Create (Crear), Read (Leer), Update (Actualizar) y Delete (Borrar). Estas son las cuatro operaciones fundamentales que realizamos sobre cualquier recurso en una aplicación.

A diferencia de las clases anteriores donde solo leíamos datos, ahora empezaremos a usar todos los métodos HTTP básicos para interactuar con nuestros recursos.

Punto de partida: Datos en memoria

Para centrarnos puramente en la lógica de la API y los métodos HTTP, seguiremos trabajando con los datos almacenados en un array de JavaScript (memoria volátil):

let jobs = [
  { id: 1, title: 'Frontend Developer' },
  { id: 2, title: 'Backend Developer' }
]

1. Read: Obtener los empleos (GET)

La operación de lectura nos permite recuperar la información. Podemos leer la colección completa o un recurso individual.

Obtener todos los empleos:

app.get('/jobs', (req, res) => {
  return res.json(jobs)
})

Obtener un empleo por su ID:

app.get('/jobs/:id', (req, res) => {
  const { id } = req.params
  const job = jobs.find(job => job.id === Number(id))

  if (!job) return res.status(404).json({ message: 'Empleo no encontrado' })
  return res.json(job)
})

2. Create: Crear un nuevo empleo (POST)

Para crear recursos usamos el método POST. Para poder leer los datos que nos envía el cliente en el cuerpo de la petición (body), debemos activar el middleware de JSON:

app.use(express.json()) // Middleware imprescindible

app.post('/jobs', (req, res) => {
  const { title } = req.body

  const newJob = {
    id: jobs.length + 1,
    title
  }

  jobs.push(newJob)

  // Respondemos con 201 Created
  return res.status(201).json(newJob)
})

3. Update: Actualizar un empleo (PATCH)

Para actualizar un recurso existente usamos el método PATCH. A diferencia de PUT (que reemplaza todo el recurso), PATCH se utiliza para actualizaciones parciales.

app.patch('/jobs/:id', (req, res) => {
  const { id } = req.params
  const { title } = req.body

  const jobIndex = jobs.findIndex(job => job.id === Number(id))
  
  if (jobIndex === -1) return res.status(404).json({ message: 'No existe' })

  // Actualizamos solo el campo title
  jobs[jobIndex] = {
    ...jobs[jobIndex],
    title
  }

  return res.json(jobs[jobIndex])
})

4. Delete: Eliminar un empleo (DELETE)

Para borrar un recurso usamos el método DELETE. Es común responder con un código 204 No Content si la operación ha sido exitosa y no hay nada que devolver.

app.delete('/jobs/:id', (req, res) => {
  const { id } = req.params

  // Filtramos el array para eliminar el elemento
  jobs = jobs.filter(job => job.id !== Number(id))

  // Respondemos con 204 (Éxito sin contenido)
  return res.status(204).send()
})

Resumen del CRUD construido

Hemos definido una interfaz completa para nuestro recurso jobs:

  • GET /jobs: Listar todos los empleos.
  • GET /jobs/:id: Obtener un empleo específico.
  • POST /jobs: Crear una nueva oferta de trabajo.
  • PATCH /jobs/:id: Actualizar una oferta existente.
  • DELETE /jobs/:id: Borrar una oferta de trabajo.

Lo que hemos aprendido

  • ✅ Qué significa CRUD y cómo se mapea a los métodos HTTP.
  • ✅ Cómo usar app.post, app.patch y app.delete.
  • ✅ La importancia de express.json() para recibir datos.
  • ✅ El uso de códigos de estado como 201 y 204.

En las siguientes clases empezaremos a profesionalizar este CRUD añadiendo validaciones, mejorando la estructura del código y preparándonos para usar bases de datos reales.