← Node.js: JavaScript fuera del navegador

Sesión 14 · Semana 5

El primer Express

Hoy · Hoja de ruta

  1. 1. Aprende: Qué es Express y cómo resuelve cada problema de ayer.
  2. 2. Haz: Reescribe tu servidor con Express, ruta a ruta.
  3. 3. Comprueba: Se comporta igual que el de ayer, con menos código.

Antes de empezar · 5 minutos, sin apuntes

  1. De los seis problemas de ayer, ¿cuáles crees que resolverá?
  2. ¿Qué esperas que siga siendo trabajo tuyo?
  3. ¿Cómo comprobarás que la reescritura no ha roto nada?

Instalar y arrancar

npm install express
import express from "express";

const app = express();

app.use(express.json());                     // analiza el cuerpo JSON
app.use(express.static("publico"));          // sirve los estáticos

app.get("/api/productos", async (peticion, respuesta) => {
  respuesta.json(await listar());
});

app.get("/api/productos/:id", async (peticion, respuesta) => {
  const producto = await obtener(Number(peticion.params.id));
  if (!producto) return respuesta.status(404).json({ error: "No encontrado" });
  respuesta.json(producto);
});

app.listen(PUERTO, () => console.log(`Escuchando en el puerto ${PUERTO}`));

Compáralo con lo de la semana pasada. Las dos primeras líneas sustituyen tu lector de cuerpo y tu servidor de estáticos enteros; :id sustituye el partido de texto a mano; y respuesta.json pone la cabecera, serializa y cierra.

El mapa de equivalencias

A mano Con Express
Condicionales por método y ruta app.get, app.post, app.put, app.delete
Partir la ruta para el identificador peticion.params.id
Analizar la cadena de consulta peticion.query
Acumular y analizar el cuerpo express.json()
Escribir estado, cabeceras y cerrar respuesta.status(...).json(...)
Tu servidor de ficheros express.static(...)

Express no valida por ti

Que peticion.body exista no significa que traiga lo que esperas: puede llegar vacío, con campos de más, con tipos que no son. Tus funciones de validación de la UD3 siguen siendo igual de necesarias, y ahora más, porque quien llama a la API puede ser cualquiera.

Un framework quita trabajo repetitivo. No quita responsabilidad.

El orden importa

app.use(express.json());            // antes de las rutas que leen el cuerpo
app.get("/api/productos", ...);
app.use((peticion, respuesta) => respuesta.status(404).json({ error: "No encontrado" }));

Express recorre lo declarado en orden hasta que algo responde. De ahí dos consecuencias que causan casi todos los desconciertos del primer día: el analizador de cuerpo va antes que las rutas que lo usan, y el 404 va al final, después de todas.

Tarea 14 · La reescritura

  1. Instala Express y anota qué cambió en package.json y en el bloqueo.
  2. Reescribe las rutas de lectura y comprueba con tu fichero .http.
  3. Reescribe la creación con validación y 201.
  4. Sustituye tu servidor de estáticos por el de Express.
  5. Añade el 404 final.
  6. Comprueba que las respuestas son idénticas a las de la semana pasada.
Objetivo mínimoTodas las rutas reescritas y respondiendo igual.
Si lo tienesMueve las rutas a src/rutas.js con un router propio.
RetoCompara líneas de código antes y después, y explica qué se ha ido.

Checkpoint · fin de la sesión 14

  • Tu servidor funciona con Express y responde igual.
  • Sabes qué pieza de Express sustituye a cada cosa que escribiste.
  • Entiendes que el orden de declaración importa.
  • Sigues validando la entrada.

Antes de cerrar · 2 minutos, sin mirar

  1. ¿Qué hace express.json() y dónde debe declararse?
  2. ¿Dónde vive el identificador de /api/productos/:id?
  3. ¿Por qué el 404 va al final?
Ver respuestas

1 · Analiza el cuerpo JSON de la petición, y va antes de las rutas que lo usan.

2 · En peticion.params.id, y llega como texto.

3 · Porque Express recorre en orden: si va antes, responde 404 a todo.