Ejemplo (4): conectando todas las piezas

Pues ahora queda cerrar este mini-caso de ejemplo conectando todas las piezas y haciendo que visitar el endpoint que hemos declarado en Express ejecute las funciones y nos devuelva contenido útil desde el endpoint.

Cuando trabajamos con bases de datos, especialmente en aplicaciones que manejan información dinámica como resultados deportivos, es fundamental anticipar que pueden surgir errores. Por eso, siempre debemos envolver nuestras consultas en bloques try para capturar cualquier excepción que pueda ocurrir y responder adecuadamente. Por ejemplo, si al intentar obtener datos de equipos o resultados algo falla, lo prudente es devolver un código HTTP 400 junto con un mensaje JSON que explique el error, para que la aplicación cliente pueda manejarlo correctamente.

Una vez asegurada esta gestión de errores, podemos centrarnos en la consulta de datos. Supongamos que queremos obtener los nombres de dos equipos específicos. Para ello, podemos hacer algo así:

try {
  const team1 = await getClub(req.params.equipo1);
  const team2 = await getClub(req.params.equipo2);
  res.json({ team1: team1.name, team2: team2.name });
} catch (e) {
  res.status(400).json({ error: e.message });
}

Con este código, si todo va bien, devolvemos solo los nombres de los equipos solicitados, evitando enviar información innecesaria que pueda confundir o sobrecargar la respuesta. Es importante ajustar la consulta para que la base de datos nos devuelva únicamente el campo name del club, simplificando así la respuesta.

Además de los nombres, es interesante mostrar la fecha en la que se juega un partido entre esos equipos. Para ello, podemos consultar el resultado asociado y extraer la fecha del encuentro. Si el partido ya se ha disputado, también podemos devolver el marcador final. La lógica sería algo así:

try {
  const match = await getMatch(req.params.equipo1, req.params.equipo2);
  if (match.score) {
    res.json({
      date: match.date,
      score: {
        [req.params.equipo1]: match.score.ft[0],
        [req.params.equipo2]: match.score.ft[1]
      }
    });
  } else {
    res.json({ date: match.date, message: "El partido se jugará en el futuro" });
  }
} catch (e) {
  res.status(400).json({ error: e.message });
}

Con este enfoque, si el partido ya tiene un marcador registrado, lo mostramos junto con la fecha. Si no, indicamos que el encuentro está programado para una fecha futura.

También es importante manejar correctamente los casos en los que se solicitan equipos que no existen en la base de datos. Por ejemplo, si pedimos un equipo con un identificador erróneo, debemos asegurarnos de que el error que devolvemos sea claro y útil. Para ello, capturamos el mensaje de error y lo enviamos en la respuesta con un código 400, como en el ejemplo anterior.

Este tipo de manejo robusto de datos y errores nos permite construir APIs claras y confiables para aplicaciones deportivas, donde los usuarios pueden consultar información precisa sobre equipos, fechas y resultados sin sorpresas ni datos confusos. Además, mantener el código modular y bien estructurado facilita futuras ampliaciones, como añadir nuevas temporadas o incluir más detalles en las respuestas.

Por último, es recomendable mantener el código bajo control de versiones, haciendo commits frecuentes para no perder avances y poder retomar o extender funcionalidades en el futuro con facilidad. Así, si en algún momento queremos añadir más ejemplos o funcionalidades, tendremos una base sólida sobre la que trabajar.

Lista de reproducción
  1. 1
    Temporada 1
    5 minutos
  2. 2
    ¿Qué es TypeScript?
    11 minutos
  3. 3
    Instalando TypeScript
    8 minutos
  4. 4
    Compilando un Hola Mundo sencillo
    7 minutos
  5. 5
    Hola Mundo pero con tipos
    10 minutos
  6. 6
    Tipos: tipos primitivos
    12 minutos
  7. 7
    Tipos: tipos especiales (any, null, ...)
    10 minutos
  8. 8
    Tipos: arrays y tuplas
    11 minutos
  9. 9
    Tipos: objetos
    7 minutos
  10. 10
    Funciones: lo básico
    9 minutos
  11. 11
    Funciones: tipando funciones
    9 minutos
  12. 12
    Clases: introducción a las clases
    9 minutos
  13. 13
    Clases: creando una clase
    10 minutos
  14. 14
    Clases: modificador private
    8 minutos
  15. 15
    Clases: modificador readonly
    3 minutos
  16. 16
    Clases: Atributos virtuales con getters y setters
    10 minutos
  17. 17
    Clases: herencia
    9 minutos
  18. 18
    Clases: modificadores abstract y protected
    8 minutos
  19. 19
    Tipos alias
    6 minutos
  20. 20
    Tipos literales
    5 minutos
  21. 21
    Uniones de tipos
    7 minutos
  22. 22
    Uniones discriminantes
    7 minutos
  23. 23
    Intersecciones de tipos
    5 minutos
  24. 24
    Interfaces: introducción
    7 minutos
  25. 25
    Interfaces: modificadores y funciones
    9 minutos
  26. 26
    Interfaces: usándolas con clases
    8 minutos
  27. 27
    Interfaces: herencia de interfaces
    8 minutos
  28. 28
    Interfaces: interfaces indizadas
    5 minutos
  29. 29
    Interfaces: funciones y tipos híbridos
    5 minutos
  30. 30
    ¿Qué diferencia hay entre interfaces y tipos? (2020)
    8 minutos
  31. 31
    Casteos con as
    6 minutos
  32. 32
    instanceof y las guardas
    9 minutos
  33. 33
    Tipos enumerados
    8 minutos
  34. 34
    Valores avanzados para enumerados
    7 minutos
  35. 35
    Enumerados con valores computados
    6 minutos
  36. 36
    Genéricos en tipos
    8 minutos
  37. 37
    Múltiples genéricos y buenas prácticas
    5 minutos
  38. 38
    Genéricos en funciones
    8 minutos
  39. 39
    Genéricos con restricciones
    6 minutos
  40. 40
    Tipos de utilidad
    3 minutos
  41. 41
    Exportando módulos
    9 minutos
  42. 42
    Importando módulos
    7 minutos
  43. 43
    Export default e import asterisco
    6 minutos
  44. 44
    tsconfig
    7 minutos
  45. 45
    Módulos desde NPM
    7 minutos
  46. 46
    Arroba types y los .d.ts
    8 minutos
  47. 47
    Ejemplo (1): creando una API REST simple en TypeScript
    11 minutos
  48. 48
    Ejemplo (2): montando un servidor Express
    8 minutos
  49. 49
    Ejemplo (3): haciendo las funciones de control de datos
    11 minutos
  50. 50
    Ejemplo (4): conectando todas las piezas
    7 minutos