¿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 | 18.x LTS | node --version |
| npm | 9.x | 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 | [email protected]: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()); // Habilitar CORS
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({
contentSecurityPolicy: false // Desactiva si usas CSP
}));
// CORS configurado
app.use(cors({
origin: process.env.CORS_ORIGIN || '*',
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: '10mb' }));
app.use(express.urlencoded({ extended: true, limit: '10mb' }));
// 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