Lección 2 de 12 · Lectura y práctica
Configuración del entorno y proyecto Express
Crea una API Express con Node.js LTS mantenido, Helmet, límites de petición y CORS para un origen explícito. Incluye configuración local y condiciones para producción.
Del concepto a la práctica
Taller de esta lección
Una configuración reproducible separa el arranque del servidor de la aplicación que recibe solicitudes. Así las pruebas pueden importar la app sin abrir un puerto. También conviene limitar el cuerpo JSON y permitir solo el origen que realmente usa el cliente.
Ejemplo resuelto
const express = require('express');
const app = express();
app.use(express.json({ limit: '32kb' }));
app.get('/health', (req, res) => res.json({ status: 'ok' }));
module.exports = app;En otro archivo, el proceso importa app y escucha en un puerto leído de configuración. Un origen permitido debe ser explícito, no una lista abierta durante producción.
Arranque CommonJS separado, con puerto válido:
const app = require('./app');
const port = Number(process.env.PORT ?? 3000);
if (!Number.isInteger(port) || port < 1 || port > 65535) {
throw new Error('PORT inválido');
}
app.listen(port, '0.0.0.0');Declara type:commonjs o usa nombres .cjs. JSON malformado debe ser400 y cuerpo sobre32kb debe ser413, con un error central que preserve ese estado. CORS regula lectura por navegadores, no autentica a clientes ni bloquea peticiones de scripts; el fragmento no configura CORS por sí solo. Salud responde aunque la base esté caída: añade readiness separado si necesitas comprobar la dependencia.
Pruébalo
Crea
app.jssin llamar alisten.Añade
/healthy el analizador JSON con límite.Define una variable de puerto con valor local claro.
Comprueba una petición válida y otra con un cuerpo mayor al límite.
Error frecuente: poner secretos o credenciales directamente en el código. Corrígelo leyendo variables de entorno y validando su presencia al iniciar.
Comprueba tu resultado
/health responde 200 y { "status": "ok" }; una carga sobredimensionada se rechaza antes de llegar a la ruta. Registra ambos resultados sin incluir secretos.

Mapa de prácticaEl navegador envía una solicitud a la API. El servidor valida la operación y consulta los datos; después devuelve una respuesta que el navegador puede mostrar. La base de datos se comunica con el servidor y no directamente con el navegador.
Ver la infografía en tamaño completo ↗¿Por qué configurar bien el entorno?
Una configuración correcta del entorno de desarrollo es fundamental por varias razones:
- Consistencia: Todos los desarrolladores del equipo trabajarán con la misma configuración
- Productividad: Herramientas bien configuradas aceleran el desarrollo
- Depuración: Un entorno bien configurado facilita encontrar y resolver errores
- Reproducibilidad: El proyecto funcionará igual en diferentes máquinas
Requisitos previos
Antes de comenzar, asegúrate de tener instalado:
| Herramienta | Versión mínima | Verificar instalación |
|---|---|---|
| Node.js | 22.x o 24.x LTS mantenido | node --version |
| npm | Incluido con la versión LTS de Node.js | npm --version |
| Git | 2.x | git --version |
| Editor de código | - | VS Code recomendado |
nvm (Node Version Manager) para gestionar múltiples versiones de Node.js. Esto es especialmente útil cuando trabajas en diferentes proyectos que requieren versiones distintas.Paso 1: Crear la estructura del proyecto
- Abre tu terminal y crea una nueva carpeta para tu proyecto
mkdir mi-api-rest-express
cd mi-api-rest-express- Inicializa el proyecto con npm
npm init -yEsto creará un archivo package.json básico. Sin embargo, para un proyecto profesional, te recomiendo inicializarlo manualmente para configurar todos los campos correctamente:
npm initResponde las preguntas interactivamente:
| Campo | Recomendación | Ejemplo |
|---|---|---|
| package name | Usa kebab-case | mi-api-rest-express |
| version | Siempre 1.0.0 inicial | 1.0.0 |
| description | Describe brevemente el proyecto | API RESTful con Node.js y Express |
| entry point | Usa src/index.js | src/index.js |
| test command | Lo configuraremos después | npm test |
| git repository | Si usas Git | git@github.com:user/repo.git |
| keywords | Palabras clave útiles | node, express, api, rest |
| author | Tu nombre | Tu Nombre |
| license | MIT para proyectos open source | MIT |
Paso 2: Estructura de carpetas profesional
Una buena estructura de carpetas es esencial para mantener tu código organizado y escalable:
mi-api-rest-express/
├── src/
│ ├── controllers/ # Lógica de los endpoints
│ ├── routes/ # Definición de rutas
│ ├── models/ # Modelos de datos
│ ├── middleware/ # Funciones intermedias
│ ├── config/ # Configuración de la app
│ ├── utils/ # Funciones utilitarias
│ └── index.js # Punto de entrada
├── tests/ # Archivos de pruebas
├── .env # Variables de entorno
├── .env.example # Plantilla de variables
├── .gitignore # Archivos ignorados por Git
├── package.json # Dependencias y scripts
└── README.md # Documentación del proyectomkdir -p src/{controllers,routes,models,middleware,config,utils} testsPaso 3: Instalar Express y dependencias esenciales
Instala Express como dependencia principal:
npm install expressPara un proyecto profesional, necesitarás herramientas adicionales:
| Dependencia | Propósito | Comando |
|---|---|---|
| express | Framework web principal | npm install express |
| dotenv | Variables de entorno | npm install dotenv |
| morgan | Registro de peticiones HTTP | npm install morgan |
| cors | Habilitar CORS | npm install cors |
| helmet | Seguridad HTTP | npm install helmet |
Instala todas de una vez:
npm install express dotenv morgan cors helmetPaso 4: Configurar package.json correctamente
Modifica tu package.json para añadir scripts útiles y configuraciones profesionales:
{
"name": "mi-api-rest-express",
"version": "1.0.0",
"description": "API RESTful construida con Node.js y Express",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js",
"dev": "node --watch src/index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": ["node", "express", "api", "rest"],
"author": "Tu Nombre",
"license": "MIT"
}node --watch para recargar automáticamente cuando cambies archivos. En versiones anteriores necesitas herramientas como nodemon.Paso 5: Crear el archivo de configuración de entorno
Crea un archivo .env en la raíz del proyecto:
PORT=3000
NODE_ENV=development
DB_HOST=localhost
DB_PORT=5432
DB_NAME=mydb
DB_USER=myuser
DB_PASSWORD=mypasswordCrea también un archivo .env.example sin valores sensibles para compartir con otros desarrolladores:
PORT=3000
NODE_ENV=development
DB_HOST=localhost
DB_PORT=5432
DB_NAME=mydb
DB_USER=myuser
DB_PASSWORD=mypassword.env a Git. Asegúrate de que esté en tu .gitignore.Paso 6: Crear el archivo .gitignore
# Dependencias
node_modules/
# Variables de entorno
.env
.env.local
.env.*.local
# Logs
logs/
*.log
npm-debug.log*
# Sistema operativo
.DS_Store
Thumbs.db
# IDE
.vscode/
.idea/
*.swp
*.swo
# Archivos de pruebas
coverage/
# Build
dist/
build/Paso 7: Crear el archivo principal de la aplicación
Crea el archivo src/index.js con la configuración básica:
// src/index.js
require('dotenv').config();
const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const morgan = require('morgan');
const app = express();
const PORT = process.env.PORT || 3000;
// Middlewares
app.use(helmet()); // Seguridad
app.use(cors({ origin: 'http://localhost:5173' })); // Solo el frontend local de la práctica
app.use(morgan('dev')); // Registro de peticiones
app.use(express.json()); // Parsear JSON
app.use(express.urlencoded({ extended: true })); // Parsear URL-encoded
// Rutas de prueba
app.get('/', (req, res) => {
res.json({
message: 'API RESTful con Express',
version: '1.0.0',
status: 'running'
});
});
// Ruta de salud para verificar que el servidor está activo
app.get('/health', (req, res) => {
res.json({
status: 'healthy',
timestamp: new Date().toISOString()
});
});
// Iniciar servidor
app.listen(PORT, () => {
console.log(`🚀 Servidor ejecutándose en http://localhost:${PORT}`);
console.log(`📊 Entorno: ${process.env.NODE_ENV || 'development'}`);
});/health es muy útil para contenedores Docker, Kubernetes y balanceadores de carga que necesitan verificar si tu aplicación está respondiendo.Paso 8: Probar el servidor
Inicia el servidor con el script que configuramos:
npm startDeberías ver en la terminal:
🚀 Servidor ejecutándose en http://localhost:3000
📊 Entorno: developmentAbre tu navegador o Postman y visita:
http://localhost:3000/- Verás el mensaje de bienvenidahttp://localhost:3000/health- Verás el estado de salud
.env.Ver más: Configuración avanzada de Express
Puedes añadir más configuraciones para producción:
// src/config/express.js
const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const morgan = require('morgan');
function configureExpress(app) {
// Seguridad
app.use(helmet()); // Conserva la política CSP predeterminada
const allowedOrigin = process.env.CORS_ORIGIN || 'http://localhost:5173';
if (process.env.NODE_ENV === 'production' && !process.env.CORS_ORIGIN) {
throw new Error('Configura CORS_ORIGIN para el frontend autorizado');
}
// CORS no sustituye autenticación ni autorización.
app.use(cors({
origin: allowedOrigin,
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
allowedHeaders: ['Content-Type', 'Authorization']
}));
// Morgan con formato personalizado
app.use(morgan(':method :url :status :response-time ms - :res[content-length]'));
// Límite de tamaño de payload
app.use(express.json({ limit: '100kb' }));
app.use(express.urlencoded({ extended: true, limit: '100kb' }));
// Compression (requiere npm install compression)
// app.use(compression());
}
module.exports = configureExpress;Ver más: Usar scripts de npm para diferentes entornos
Modifica tu package.json para scripts por entorno:
"scripts": {
"start": "node src/index.js",
"start:prod": "NODE_ENV=production node src/index.js",
"dev": "NODE_ENV=development nodemon src/index.js",
"test": "jest",
"test:watch": "jest --watch",
"lint": "eslint src/",
"lint:fix": "eslint src/ --fix"
}Resumen de lo aprendido
En esta lección hemos configurado un entorno de desarrollo profesional para crear APIs REST con Express. Los puntos clave son:
- Creamos la estructura de carpetas siguiendo las mejores prácticas
- Inicializamos el proyecto con
npm init - Instalamos Express y dependencias esenciales (helmet, cors, morgan, dotenv)
- Configuramos los scripts de npm para diferentes entornos
- Creamos archivos de configuración para variables de entorno
- Estructuramos el código principal con middlewares de seguridad
- Probamos que el servidor funciona correctamente
Un proyecto bien configurado desde el inicio nos ahorra tiempo y problemas a medida que el código crece.
¿Cuál es la función principal del middleware helmet en Express?
- A) Aumentar la velocidad del servidor
- B) Implementar headers de seguridad HTTP
- C) Parsear bodies JSON
- D) Habilitar CORS automáticamente
¿Por qué es importante crear un archivo .env.example?
- A) Para que el proyecto funcione más rápido
- B) Para documentar qué variables de entorno necesita el proyecto sin exponer valores sensibles
- C) Para que npm instale las dependencias correctamente
- D) No es importante, se puede omitir
¿Cuál de las siguientes NO es una dependencia que instalamos?
- A) express
- B) dotenv
- C) mongoose
- D) cors
Antes de usarlo fuera de tu equipo
La práctica permite solamente el origen del frontend local. En producción, configura el origen exacto, conserva los encabezados de Helmet y valida entradas, identidad y permisos de cada operación. CORS decide qué respuestas puede leer un navegador desde otro origen; no bloquea por sí solo las llamadas de otros clientes.
Referencias: soporte de Node.js, middleware CORS, guía de seguridad de Express y configuración de Helmet. Sirve tráfico público mediante HTTPS y elige límites de petición según las necesidades reales de la API.
Sigue con Node.js y Express: Construye APIs REST Profesionales
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.