Hoy · Hoja de ruta
- 1. Aprende: Qué es Express y cómo resuelve cada problema de ayer.
- 2. Haz: Reescribe tu servidor con Express, ruta a ruta.
- 3. Comprueba: Se comporta igual que el de ayer, con menos código.
Antes de empezar · 5 minutos, sin apuntes
- De los seis problemas de ayer, ¿cuáles crees que resolverá?
- ¿Qué esperas que siga siendo trabajo tuyo?
- ¿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
- Instala Express y anota qué cambió en
package.jsony en el bloqueo. - Reescribe las rutas de lectura y comprueba con tu fichero
.http. - Reescribe la creación con validación y 201.
- Sustituye tu servidor de estáticos por el de Express.
- Añade el 404 final.
- Comprueba que las respuestas son idénticas a las de la semana pasada.
src/rutas.js con un router propio.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
- ¿Qué hace
express.json()y dónde debe declararse? - ¿Dónde vive el identificador de
/api/productos/:id? - ¿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.