Conceptos básicos de Express
10 ejemplos para construir tu primera API con Express 5: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para construir tu primera API con Express 5: 7 básicos y 3 intermedios.
mkdir express-api && cd express-api
npm init -y
npm pkg set type=module
npm install express@5
npm install -D typescript@5.6 tsx @types/express @types/nodePara el orden del middleware y el endurecimiento de la seguridad, consulta Orden del Middleware y Middleware de Seguridad.
import express from "express";
const app = express();
const port = 3000;
app.get("/", (_req, res) => {
res.send("Hola desde Express 5\n");
});
app.listen(port, () => {
console.log(`http://localhost:${port}`);
});app es una función que envuelve http.createServer de Noderes.send() establece Content-Type automáticamente según la carga útilimport express from "express";
const app = express();
app.use(express.json({ limit: "1mb" }));
app.post("/users", (req, res) => {
const { name, email } = req.body;
res.status(201).json({ id: 1, name, email });
});express.json() debe registrarse antes de las rutas que leen req.bodylimit para prevenir ataques de carga útil grandeimport express from "express";
const app = express();
app.get("/users/:id", (req, res) => {
const { id } = req.params;
res.json({ id, name: "Ada Lovelace" });
});req.params contiene segmentos de ruta con nombreid en el manejador o en un middleware de validaciónimport express from "express";
const app = express();
app.get("/search", (req, res) => {
const q = req.query.q as string | undefined;
const page = Number(req.query.page ?? 1);
res.json({ q, page, results: [] });
});req.query se analiza automáticamenteimport express, { Router } from "express";
const app = express();
const usersRouter = Router();
usersRouter.get("/", (_req, res) => {
res.json([{ id: 1, name: "Ada" }]);
});
usersRouter.get("/:id", (req, res) => {
res.json({ id: req.params.id });
});
app.use("/users", usersRouter);Router es una mini-aplicación con su propia pila de middlewareimport express from "express";
const app = express();
app.use((req, _res, next) => {
console.log(`${req.method} ${req.url}`);
next();
});
app.get("/health", (_req, res) => {
res.json({ status: "ok" });
});next() para pasar el control al siguiente manejadorimport express from "express";
import { join } from "node:path";
const app = express();
app.use("/static", express.static(join(import.meta.dirname, "public")));express.static sirve archivos desde un directorioimport express from "express";
const app = express();
app.get("/users/:id", async (req, res) => {
const user = await findUser(req.params.id);
if (!user) {
res.status(404).json({ error: "No encontrado" });
return;
}
res.json(user);
});
async function findUser(id: string) {
if (id === "999") return null;
return { id, name: "Ada" };
}express-async-errors o envoltorios manuales try/catchimport express, { type Request, type Response, type NextFunction } from "express";
const app = express();
app.get("/fail", () => {
throw new Error("Algo se rompió");
});
app.use((err: Error, _req: Request, res: Response, _next: NextFunction) => {
console.error(err);
res.status(500).json({ error: "Error interno del servidor" });
});(err, req, res, next)import express from "express";
const app = express();
const port = Number(process.env.PORT ?? 3000);
const isDev = process.env.NODE_ENV !== "production";
if (isDev) {
app.use((req, _res, next) => {
console.log(`[dev] ${req.method} ${req.path}`);
next();
});
}
app.get("/health", (_req, res) => {
res.json({ env: process.env.NODE_ENV ?? "development" });
});
app.listen(port);PORT del entorno (Heroku, Railway, K8s lo configuran)NODE_ENVSí, en Node 24 LTS. Es la versión principal latest actual de npm. Migra de Express 4 usando los patrones de la guía de migración oficial en Migración a Express 5.
Express si la familiaridad del equipo y el tamaño del ecosistema son lo más importante. Fastify si el rendimiento y la validación de esquemas JSON son prioridades. Consulta ADR Fastify vs Express.
app.listen está bien para la mayoría de las aplicaciones. Usa createServer(app) cuando necesites acceso directo al servidor subyacente para actualizaciones de WebSocket o ajuste de tiempos de espera.
Routers por dominio (/users, /orders), servicios para lógica de negocio, app.ts y server.ts separados. Consulta Mejores prácticas de Express.
Sí. Establece "type": "module" en package.json y usa import express from "express".
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026