← Servidor web y API con Node

Sesión 3 · Semana 1

Router y estructura

Hoy · Hoja de ruta

  1. 1. Aprende: Cómo se reparte una aplicación Express en ficheros y qué hace un router.
  2. 2. Haz: Reorganiza tu proyecto con la estructura de la unidad.
  3. 3. Comprueba: Cada fichero se explica en una frase y el arranque queda separado de la aplicación.

Antes de empezar · 5 minutos, sin apuntes

  1. ¿Cuántas líneas tiene hoy tu servidor.js?
  2. ¿Qué partes cambiarían si añadieras un segundo recurso?
  3. ¿Cómo probarías tu aplicación sin levantar un servidor?

Un router por recurso

// src/rutas/productos.js
import { Router } from "express";

const router = Router();

router.get("/", listarProductos);
router.get("/:id", obtenerProducto);
router.post("/", crearProducto);
router.put("/:id", reemplazarProducto);
router.delete("/:id", borrarProducto);

export default router;
// src/app.js
import express from "express";
import productos from "./rutas/productos.js";

export function crearApp() {
  const app = express();

  app.use(express.json({ limit: "100kb" }));
  app.use(registro);
  app.use(express.static("publico"));

  app.use("/api/productos", productos);

  app.use(noEncontrado);
  app.use(manejadorDeErrores);
  return app;
}

Las rutas del router son relativas al punto donde se monta, así que la ruta base aparece una sola vez. Cambiar /api/productos por /api/v1/productos es cambiar una línea.

Separar la aplicación del arranque

// src/servidor.js
import { crearApp } from "./app.js";

const PUERTO = Number(process.env.PUERTO ?? 3000);
crearApp().listen(PUERTO, () => console.log(`Escuchando en el puerto ${PUERTO}`));

Quien crea la aplicación no debe arrancarla

Si app.js llama a listen, importarlo desde una prueba levanta un servidor de verdad, ocupa un puerto y obliga a apagarlo después.

Con la aplicación por un lado y el arranque por otro, las pruebas de la sesión 15 importan la aplicación y le hacen peticiones sin abrir ningún puerto. Es una decisión de dos líneas que decide si tu proyecto se puede probar.

El orden, otra vez

El orden de la cadena
  1. Analizador del cuerpo y registro
  2. Estáticos
  3. Routers de la API
  4. 404 para lo que no encajó
  5. Manejador de errores, siempre el último

Tarea 3 · Reorganizar

  1. Crea src/app.js con crearApp() y deja servidor.js solo con el arranque.
  2. Mueve las rutas de productos a su router.
  3. Mueve el registro y los errores a src/middleware/.
  4. Comprueba que todo sigue funcionando con tu fichero de peticiones.
  5. Añade un segundo router vacío para un recurso nuevo y monta su ruta base.
  6. Escribe en cada fichero la frase que lo describe.
Objetivo mínimoAplicación separada del arranque y rutas en su router.
Si lo tienesMonta la API bajo /api/v1 cambiando una sola línea.
RetoEscribe un pequeño programa que importe la aplicación y le haga una petición sin levantar el puerto.

Cierre de la semana 1

  • Tu API está diseñada por recursos y escrita como contrato.
  • Todos los errores comparten forma.
  • Cada recurso tiene su router.
  • La aplicación se puede crear sin arrancarla.
Ver respuestas

1 · Para poder importarla en las pruebas sin ocupar un puerto.

2 · Relativas al punto donde se monta el router.

3 · El manejador de errores, después incluso del 404.

Microprueba semanal 1 · 5–10 minutos

Individual, sin IA y sin apuntes.

  1. Reescribe orientadas a recursos: /obtenerProductos y /borrarProducto?id=7.
  2. Di qué código de estado devuelve cada operación del CRUD cuando va bien.
  3. ¿Por qué la aplicación se crea en un fichero y se arranca en otro?
---