← Node & Express

Fundamentos de Express

¿Qué es Express y qué problema resuelve sobre el módulo `http` de Node?

Ver respuesta — intenta responderla en voz alta primero

Express es un framework web minimalista para Node.js construido encima del módulo http de Node. Simplifica el trabajo de crear servidores: te da un sistema de routing limpio, soporte para middleware y una API más cómoda para manejar los objetos req (request) y res (response). No es opinado: no te obliga a una estructura de carpetas ni a una forma de organizar el proyecto.

Con el módulo http de Node puedes crear un servidor, pero todo lo tienes que hacer a mano: revisar req.method y req.url con if/else, parsear la URL, escribir los headers, etc. Es verboso y repetitivo.

Express pone una capa cómoda encima de eso:

  • Routing sencillo: en vez de un if gigante, escribes app.get("/ruta", ...), app.post(...), etc.
  • Middleware: funciones que se ejecutan en cadena para cada petición (logs, autenticación, parseo del body...).
  • Helpers en req y res: métodos como res.json(), res.status() o req.params que te ahorran código.
  • No es opinado: Express no impone estructura. Tú decides cómo organizar carpetas, qué base de datos usar y cómo dividir el código. Es flexible, a diferencia de frameworks "con opinión" como Nest o Rails.

Idea clave: Express no reemplaza al módulo http, lo envuelve. Por debajo sigue siendo el mismo servidor de Node.

// Importamos Express (después de instalarlo con: npm install express)
const express = require("express");

// Creamos la aplicación: 'app' es nuestro servidor Express
const app = express();

// Definimos una ruta: cuando llegue un GET a "/", respondemos texto
app.get("/", (req, res) => {
  res.send("¡Hola desde Express!");
});

// Otra ruta que responde JSON
app.get("/estado", (req, res) => {
  res.json({ ok: true, mensaje: "El servidor está vivo" });
});

// Ponemos el servidor a escuchar en el puerto 3000
app.listen(3000, () => {
  console.log("Servidor escuchando en http://localhost:3000");
});

Para comparar, así se vería lo mismo sin Express, usando solo el módulo http:

const http = require("http");

// Tenemos que revisar method y url a mano, y escribir headers manualmente
const server = http.createServer((req, res) => {
  if (req.method === "GET" && req.url === "/") {
    res.writeHead(200, { "Content-Type": "text/plain" });
    res.end("¡Hola desde Node puro!");
  } else {
    res.writeHead(404);
    res.end("No encontrado");
  }
});

server.listen(3000);

Pensar que Express es Node o que reemplaza al servidor HTTP. Express es solo una librería (dependencia) que corre sobre Node y usa su módulo http por debajo. Por eso tienes que instalarlo (npm install express) mientras que http ya viene incluido en Node. Otro error frecuente es olvidar llamar a app.listen(...): sin eso el servidor nunca se levanta y las rutas no responden.

"Express es un framework web minimalista de Node que corre sobre el módulo http. No lo reemplaza, lo envuelve para darte una API más cómoda. Sin Express tendrías que revisar req.method y req.url con un montón de if, parsear todo a mano y escribir los headers tú mismo. Express te da routing con app.get, app.post, etc., soporte para middleware y helpers como res.json. Además no es opinado: no te impone estructura de carpetas ni forma de organizar el proyecto, tú decides. Un servidor mínimo son tres pasos: crear la app con express(), definir rutas con app.get, y arrancar con app.listen."

Reto rápido

¿Por qué decimos que Express "no es opinado", y menciona una razón por la que necesitas hacer npm install express pero no necesitas instalar http?

Ver respuesta

Decimos que Express no es opinado porque no te obliga a una estructura de carpetas, un patrón de arquitectura ni una base de datos concreta: tú decides cómo organizar todo. Frameworks "con opinión" (como Nest o Rails) sí imponen convenciones.

Necesitas npm install express porque Express es una dependencia externa (una librería de terceros que no viene con Node). En cambio, http es un módulo nativo que ya viene incluido en Node, por eso solo lo haces require("http") sin instalar nada.