← Servidor web y API con Node

Sesión 8 · Semana 3

Persistencia y consistencia

Hoy · Hoja de ruta

  1. 1. Aprende: Cómo se sostiene la coherencia de los datos y qué pasa cuando se pierde.
  2. 2. Haz: Sustituye el repositorio por otro sin tocar nada más.
  3. 3. Comprueba: La API se comporta igual con los dos.

Antes de empezar · 5 minutos, sin apuntes

  1. ¿Qué pasa si el fichero de datos tiene un producto sin precio?
  2. ¿Y si tiene dos con el mismo identificador?
  3. ¿Quién garantiza que eso no ocurra?

El repositorio como frontera

// La interfaz que el servicio conoce
export async function todos() {}
export async function porId(id) {}
export async function guardar(producto) {}
export async function eliminar(id) {}

Mientras el conjunto de funciones y lo que devuelven no cambie, el servicio no distingue si detrás hay un fichero, una base de datos o una API ajena. Eso es lo que hace posible el ejercicio de hoy.

Datos que llegan rotos

function normalizar(crudo) {
  return {
    id: Number(crudo.id),
    nombre: String(crudo.nombre ?? "").trim(),
    precio: Number(crudo.precio ?? 0),
    stock: Number.isInteger(crudo.stock) ? crudo.stock : 0,
    categoria: crudo.categoria ?? "sin-categoria"
  };
}

El fichero de datos también es entrada externa

Alguien puede editarlo a mano, puede venir de una versión anterior con otros campos, puede haberse quedado a medias. Si el repositorio devuelve lo que encuentre sin mirar, un dato roto se propaga hasta la respuesta.

Normalizar al leer da al resto del programa la garantía de que un producto tiene la forma de un producto. Es la misma idea de validar en el borde, aplicada al borde de abajo.

Sembrar y reiniciar

Un proyecto que se prueba necesita poder volver a un estado conocido:

{ "scripts": { "sembrar": "node src/herramientas/sembrar.js" } }

Un script que rellena el fichero con datos de ejemplo. Sin él, cada prueba deja los datos en un estado distinto y los fallos dejan de ser reproducibles.

Tarea 8 · Cambiar el almacén

  1. Escribe la lista de funciones que el servicio espera del repositorio.
  2. Normaliza los datos al leerlos del fichero.
  3. Escribe un segundo repositorio que guarde en memoria.
  4. Cambia entre uno y otro con una variable de entorno.
  5. Comprueba que la API se comporta igual con los dos y que no has tocado ni rutas ni servicio.
  6. Escribe el script de siembra.
Objetivo mínimoDos repositorios intercambiables y la API idéntica con ambos.
Si lo tienesDetecta identificadores duplicados al leer y avisa por el registro.
RetoEscribe un tercer repositorio contra una API externa y sostén la misma interfaz.

Checkpoint · fin de la sesión 8

  • El repositorio tiene una interfaz clara.
  • Los datos se normalizan al leerse.
  • Has cambiado de almacén sin tocar las capas superiores.
  • Puedes volver a un estado conocido con un comando.
Ver respuestas

1 · Porque puede editarse a mano o venir de otra versión: es entrada externa.

2 · Mientras se mantenga la interfaz que el servicio espera.

3 · Para poder reproducir los fallos partiendo siempre del mismo estado.