Cómo crear tu primera API REST con Node.js y Express
Guía completa para crear tu primera API REST: HTTP, rutas, controladores, validación, errores, CORS, variables de entorno, Postman y deploy mental model.
camilogaon
@camilogaon
Cómo crear tu primera API REST con Node.js y Express
Una API REST es el puente entre tu frontend y tus datos. Esta guía te construye una API de posts de blog paso a paso.
Stack: Node.js + Express + JS/TS mental model
Meta: entender rutas, status codes, validación y estructura
//1. HTTP en 5 minutos
| Método | Uso |
|---|---|
| GET | Leer |
| POST | Crear |
| PATCH/PUT | Actualizar |
| DELETE | Borrar |
Status útiles: 200, 201, 400, 401, 404, 500.
//2. Proyecto base
mkdir blog-api && cd blog-api
npm init -y
npm i express cors dotenv
npm i -D nodemon
package.json:
{
"scripts": {
"dev": "nodemon src/index.js"
}
}
// src/index.js
require("dotenv").config();
const express = require("express");
const cors = require("cors");
const app = express();
app.use(cors());
app.use(express.json());
app.get("/health", (_req, res) => {
res.json({ ok: true });
});
const port = process.env.PORT || 3001;
app.listen(port, () => console.log(`API on :${port}`));
//3. Recurso posts (en memoria)
let posts = [
{ id: "1", title: "Hola API", excerpt: "Primer post", published: true },
];
app.get("/posts", (_req, res) => {
res.json({ items: posts });
});
app.get("/posts/:id", (req, res) => {
const post = posts.find((p) => p.id === req.params.id);
if (!post) return res.status(404).json({ message: "No encontrado" });
res.json(post);
});
//4. Crear y validar
app.post("/posts", (req, res) => {
const { title, excerpt } = req.body || {};
if (!title || title.length < 3) {
return res.status(400).json({ message: "title inválido" });
}
const post = {
id: String(Date.now()),
title,
excerpt: excerpt || "",
published: false,
};
posts.push(post);
res.status(201).json(post);
});
//5. Update y delete
app.patch("/posts/:id", (req, res) => {
const post = posts.find((p) => p.id === req.params.id);
if (!post) return res.status(404).json({ message: "No encontrado" });
Object.assign(post, req.body);
res.json(post);
});
app.delete("/posts/:id", (req, res) => {
const before = posts.length;
posts = posts.filter((p) => p.id !== req.params.id);
if (posts.length === before) {
return res.status(404).json({ message: "No encontrado" });
}
res.status(204).end();
});
//6. Estructura que escala
src/
index.js
routes/posts.js
controllers/postsController.js
data/store.js
Separa rutas (wiring) de controladores (lógica). Después vendrá servicios + DB.
//7. Errores centralizados
app.use((err, _req, res, _next) => {
console.error(err);
res.status(500).json({ message: "Error interno" });
});
//8. Variables de entorno
.env
PORT=3001
CORS_ORIGIN=http://localhost:3000
Nunca subas .env a GitHub.
//9. Probar con Postman/curl
curl http://localhost:3001/posts
curl -X POST http://localhost:3001/posts \
-H "Content-Type: application/json" \
-d "{\"title\":\"Mi post\",\"excerpt\":\"demo\"}"
//10. Siguiente nivel (camino Programemos)
- Persistir con Prisma + PostgreSQL
- Auth JWT
- Migrar mental model a NestJS (módulos/DTOs/guards)
- Paginación, filtros, SEO endpoints
//11. Checklist de API junior
- CRUD completo
- Validación de input
- Status codes correctos
- CORS configurado
- README con endpoints
- Ejemplos Postman/curl
//Conclusión
Si entiendes recursos, verbos HTTP y validación, ya construyes backends. Tu siguiente API: posts con DB real y auth.
FAQ
¿Qué es una API REST?
Un estilo de diseño donde el servidor expone recursos por HTTP (GET/POST/PATCH/DELETE) usando URLs y códigos de estado.
¿Express o NestJS para empezar?
Express es perfecto para aprender los fundamentos. NestJS aporta estructura cuando el proyecto crece (como en Programemos).
¿Necesito base de datos desde el día 1?
No. Empieza en memoria o JSON; luego conecta PostgreSQL/Prisma cuando el CRUD esté claro.
¿Qué es CORS?
Un mecanismo del navegador que restringe peticiones entre orígenes. Tu API debe permitir el frontend autorizado.
¿Cómo pruebo la API?
Con Postman, Insomnia, Thunder Client o curl. Luego automatiza con tests.