Saltar al contenido

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

js
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:

js
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

  1. Crea app.js sin llamar a listen.

  2. Añade /health y el analizador JSON con límite.

  3. Define una variable de puerto con valor local claro.

  4. 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.

Navegador, API y base de datos conectados por solicitudes, consultas y respuestas en sentidos opuestos.
CursaloMapa de práctica
Del navegador a los datos

El 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 ↗
CONCEPTO CLAVE: Express.js es el framework web más popular para Node.js que nos permite construir APIs REST de manera rápida, minimalista y extensible. Antes de escribir nuestra primera línea de código, necesitamos configurar correctamente nuestro entorno de desarrollo y estructurar un proyecto profesional.

¿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:

HerramientaVersión mínimaVerificar instalación
Node.js22.x o 24.x LTS mantenidonode --version
npmIncluido con la versión LTS de Node.jsnpm --version
Git2.xgit --version
Editor de código-VS Code recomendado
💡 Tip: Usa 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

  1. Abre tu terminal y crea una nueva carpeta para tu proyecto
mkdir mi-api-rest-express
cd mi-api-rest-express
  1. Inicializa el proyecto con npm
npm init -y

Esto creará un archivo package.json básico. Sin embargo, para un proyecto profesional, te recomiendo inicializarlo manualmente para configurar todos los campos correctamente:

npm init

Responde las preguntas interactivamente:

CampoRecomendaciónEjemplo
package nameUsa kebab-casemi-api-rest-express
versionSiempre 1.0.0 inicial1.0.0
descriptionDescribe brevemente el proyectoAPI RESTful con Node.js y Express
entry pointUsa src/index.jssrc/index.js
test commandLo configuraremos despuésnpm test
git repositorySi usas Gitgit@github.com:user/repo.git
keywordsPalabras clave útilesnode, express, api, rest
authorTu nombreTu Nombre
licenseMIT para proyectos open sourceMIT

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 proyecto
💡 Tip: Crea la estructura de carpetas con un solo comando:
mkdir -p src/{controllers,routes,models,middleware,config,utils} tests

Paso 3: Instalar Express y dependencias esenciales

Instala Express como dependencia principal:

npm install express

Para un proyecto profesional, necesitarás herramientas adicionales:

DependenciaPropósitoComando
expressFramework web principalnpm install express
dotenvVariables de entornonpm install dotenv
morganRegistro de peticiones HTTPnpm install morgan
corsHabilitar CORSnpm install cors
helmetSeguridad HTTPnpm install helmet

Instala todas de una vez:

npm install express dotenv morgan cors helmet

Paso 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"
}
⚠️ Advertencia: En las ramas LTS seleccionadas para esta práctica, puedes usar 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=mypassword

Crea 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
⚠️ Importante: Nunca subas el archivo .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'}`);
});
💡 Tip: La ruta /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 start

Deberías ver en la terminal:

🚀 Servidor ejecutándose en http://localhost:3000
📊 Entorno: development

Abre tu navegador o Postman y visita:

  • http://localhost:3000/ - Verás el mensaje de bienvenida
  • http://localhost:3000/health - Verás el estado de salud
📌 Callout: Si tu servidor no inicia, verifica que el puerto 3000 no esté siendo usado por otra aplicación. Puedes cambiar el puerto en el archivo .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:

  1. Creamos la estructura de carpetas siguiendo las mejores prácticas
  2. Inicializamos el proyecto con npm init
  3. Instalamos Express y dependencias esenciales (helmet, cors, morgan, dotenv)
  4. Configuramos los scripts de npm para diferentes entornos
  5. Creamos archivos de configuración para variables de entorno
  6. Estructuramos el código principal con middlewares de seguridad
  7. 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.
🧠 Quiz: Configuración del entorno Express

¿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
✅ Respuesta correcta: B) Implementar headers de seguridad HTTP. Helmet configura diversos headers HTTP para hacer tu aplicación más segura, como X-Frame-Options, XSS Protection, Strict-Transport-Security, entre otros.
🧠 Quiz: Configuración del entorno Express

¿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
✅ Respuesta correcta: B) El archivo .env.example sirve como documentación para otros desarrolladores, indicando qué variables necesitan configurar, sin exponer contraseñas o claves sensibles.
🧠 Quiz: Configuración del entorno Express

¿Cuál de las siguientes NO es una dependencia que instalamos?

  • A) express
  • B) dotenv
  • C) mongoose
  • D) cors
✅ Respuesta correcta: C) mongoose. Mongoose es un ODM (Object Data Modeling) para MongoDB. En esta lección instalamos express, dotenv, cors, helmet y morgan, pero no mongoose ya que eso corresponde a lecciones futuras sobre bases de datos.
💡 Próximo paso: En la siguiente lección aprenderemos a estructurar rutas y controladores de manera modular, separando la lógica de tu API en archivos organizados.

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.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.