Saltar al contenido
Curso de Node.js y APIs
Todos los cursos

Ejercicio: API REST y verbos HTTP

  • ⏱ 60 minutos
  • 📶 Nivel: intermedio

Objetivo

Construir en tu computadora una API CRUD de libros con Express y reproducir en JavaScript puro el repositorio en memoria que hay detrás de un CRUD.

Cómo se trabaja

La parte A es práctica real en tu terminal. La parte B son dos funciones de JavaScript puro: estadoExito y crearRepositorio, el «almacén» que usan las rutas. Pega solo el JavaScript, sin <script>.

▶ Prueba tu código aquí (opcional)
Consola

Pasos

Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.

💡 Pista 1: ¿el id no coincide?

req.params.id es un texto. Conviértelo con Number antes de buscar.

💡 Pista 2: crearRepositorio

Devuelve un objeto con funciones; el array y el contador viven dentro de crearRepositorio (clausura), no fuera.

💡 Pista 3: reemplazar frente a actualizar

reemplazar construye { id, ...datos }; actualizar construye { ...actual, ...cambios, id }.

🔎 Comprueba tu trabajo

Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista. Pega solo el JavaScript, sin las etiquetas <script>.

    ✅ Ver una solución posible

    Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.

    repositorio.js
    function estadoExito(verbo) {
      const estados = { GET: 200, POST: 201, PUT: 200, PATCH: 200, DELETE: 204 };
      return estados[String(verbo).toUpperCase()] ?? null;
    }
    
    function crearRepositorio() {
      let items = [];
      let siguienteId = 1;
    
      return {
        listar() {
          return items;
        },
        obtener(id) {
          return items.find((x) => x.id === id) ?? null;
        },
        crear(datos) {
          const nuevo = { id: siguienteId++, ...datos };
          items.push(nuevo);
          return nuevo;
        },
        reemplazar(id, datos) {
          const i = items.findIndex((x) => x.id === id);
          if (i === -1) return null;
          items[i] = { id, ...datos };
          return items[i];
        },
        actualizar(id, cambios) {
          const i = items.findIndex((x) => x.id === id);
          if (i === -1) return null;
          items[i] = { ...items[i], ...cambios, id };
          return items[i];
        },
        borrar(id) {
          const i = items.findIndex((x) => x.id === id);
          if (i === -1) return false;
          items.splice(i, 1);
          return true;
        },
      };
    }

    💡 🏁 Reto extra (opcional)

    Haz que GET /libros admita ?orden=titulo para ordenar alfabéticamente y ?limite=2 para devolver solo los primeros. Recuerda convertir el límite a número.