Desplegar una aplicación Node.js en producción significa publicarla en un servidor real para que otros usuarios puedan acceder a ella desde internet.
El momento en que tu código deja de ser tuyo
Imagina que pasaste semanas construyendo una API para gestionar inventario de una tienda como Liverpool. La probaste en tu computadora. Funciona perfecto. Pero cuando intentas compartirla con tu equipo, nadie puede acceder porque solo existe en tu máquina local. Ese es el problema que el despliegue resuelve. Publicar tu aplicación es el último paso que convierte tu trabajo en algo real y útil.
En esta lección vas a aprender el sistema completo para llevar tu aplicación de tu computadora a un servidor público. Lo llamaremos el Sistema PREPARAR-PUBLICAR-PROTEGER.
El Sistema PREPARAR-PUBLICAR-PROTEGER
Este sistema tiene tres fases. Primero preparas tu aplicación para producción. Luego la publicas en una plataforma de nube. Finalmente la proteges con variables de entorno y manejo de errores robusto. Cada fase es obligatoria. Saltarte una causa problemas serios.
Fase 1: Preparar tu aplicación
Antes de subir cualquier código, tu aplicación necesita cumplir tres condiciones.
1. El puerto debe ser dinámico
En desarrollo usas un puerto fijo como 3000. En producción, la plataforma asigna el puerto automáticamente. Tu código debe aceptar ese valor:
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Servidor corriendo en puerto ${PORT}`);
});
Si no haces esto, tu aplicación nunca arranca en el servidor.
2. El archivo .env nunca se sube
Tu archivo .env contiene contraseñas y claves privadas. Agrega estas dos líneas a tu .gitignore:
.env
node_modules/
Estas carpetas y archivos no deben existir en tu repositorio de GitHub. Las credenciales se configuran directamente en la plataforma de despliegue.
3. El package.json necesita el script start
Las plataformas de nube buscan este script para iniciar tu aplicación. Verifica que tu package.json lo tenga:
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js"
}
El script dev es solo para tu computadora. En producción se usa start.
Fase 2: Publicar en Railway o Render
Dos plataformas gratuitas son ideales para comenzar: Railway y Render. Ambas detectan automáticamente que tu proyecto es Node.js y lo configuran solas.
Desplegar en Railway
Railway es la opción más rápida. Sigue estos pasos:
- Ve a railway.app y crea una cuenta con GitHub.
- Haz clic en "New Project" y selecciona tu repositorio.
- Railway detecta Node.js y ejecuta
npm installynpm startautomáticamente. - En la sección "Variables", agrega tus variables de entorno (las mismas que tenías en
.env). - En "Settings → Networking", genera un dominio público.
En menos de cinco minutos tu API está disponible en una URL como https://mi-api.up.railway.app.
Desplegar en Render
Render ofrece más configuración manual pero es igualmente confiable:
- Ve a render.com y conecta tu cuenta de GitHub.
- Crea un "New Web Service" y selecciona tu repositorio.
- Configura estos campos:
- Build Command:
npm install - Start Command:
npm start
- Build Command:
- Agrega tus variables de entorno en la sección "Environment".
- Haz clic en "Create Web Service".
Render tarda unos minutos en el primer despliegue. Los siguientes son automáticos cada vez que haces git push.
Fase 3: Proteger la aplicación en producción
Una aplicación en producción necesita resistir errores sin caerse. Aquí hay tres prácticas esenciales.
Variables de entorno correctas
Configura todas tus variables directamente en el panel de Railway o Render. Nunca las escribas directo en el código. Para una API de catálogo de productos similar a la de FEMSA, tus variables se verían así en el panel:
MONGODB_URI=mongodb+srv://usuario:password@cluster.mongodb.net/femsa_catalogo
PORT=3000
JWT_SECRET=clave_super_secreta_2024
NODE_ENV=production
La variable NODE_ENV=production es importante. Muchas librerías cambian su comportamiento según este valor.
Manejo de errores global
En producción, un error no manejado puede tumbar todo el servidor. Agrega este middleware al final de tu index.js, después de todas tus rutas:
// Middleware para errores globales
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({
mensaje: "Error interno del servidor",
error: process.env.NODE_ENV === "production" ? {} : err.message
});
});
Este middleware hace algo inteligente: en producción oculta los detalles del error al usuario, pero los registra en consola. En desarrollo los muestra completos. Así proteges información sensible sin perder capacidad de diagnóstico.
Prueba tu API desplegada
Una vez publicada, prueba tus endpoints con esta estructura. Supón que construiste la API de Bimbo para gestionar pedidos:
# Crear un pedido nuevo
curl -X POST https://bimbo-api.up.railway.app/api/pedidos \
-H "Content-Type: application/json" \
-d '{"producto": "Pan Blanco", "cantidad": 50, "precio": 18500}'
# Consultar todos los pedidos
curl https://bimbo-api.up.railway.app/api/pedidos
Si recibes respuestas JSON correctas, tu despliegue funcionó.
Errores comunes al desplegar
Estos son los problemas más frecuentes y cómo resolverlos:
Error: "Application failed to start"
Causa más común: el script start falta en package.json o usa un archivo que no existe. Verifica que "start": "node index.js" apunte al archivo correcto.
Error: "Cannot connect to MongoDB"
Causa: la variable MONGODB_URI no está configurada en la plataforma. Revisa el panel de variables de entorno. También verifica que en MongoDB Atlas hayas permitido conexiones desde cualquier IP (0.0.0.0/0) en la sección "Network Access".
Error: "Port already in use"
Esto no ocurre en producción si usas process.env.PORT. Si lo ves, es porque forzaste un puerto fijo. Corrige con el código de la Fase 1.
La aplicación funciona local pero falla en producción
Revisa que todas las dependencias estén en dependencies y no solo en devDependencies dentro de package.json. Railway y Render no instalan devDependencies en producción.
Lo que aprendiste en este curso
Llegaste al final de Node.js Básico. Recorre mentalmente el camino que recorriste:
- Instalaste Node.js y entendiste cómo funciona el servidor sin navegador.
- Creaste servidores HTTP con el módulo nativo y luego con Express.
- Construiste rutas organizadas con parámetros y middlewares.
- Conectaste tu API a MongoDB usando Mongoose con schemas y validaciones.
- Aprendiste a proteger credenciales con variables de entorno.
- Y ahora desplegaste tu aplicación para que el mundo pueda usarla.
Ese es el flujo completo de un desarrollador backend junior en México. Con esas habilidades puedes aplicar a posiciones que pagan entre $15,000 y $28,000 al mes en empresas de tecnología o en equipos digitales de empresas como Mercado Libre o startups fintech.
Tus próximos pasos concretos
No dejes que este conocimiento se enfríe. Esta semana haz estas tres cosas:
1. Despliega algo hoy. Toma cualquier proyecto que hayas hecho en este curso y publícalo en Railway. No importa si es pequeño. El objetivo es completar el ciclo completo una vez.
2. Agrega autenticación. El siguiente paso natural es aprender JWT (JSON Web Tokens) para proteger tus rutas. Busca el paquete jsonwebtoken en npm y experimenta.
3. Conecta un frontend. Una API sola es útil, pero conectarla con React o con una página simple HTML le da vida completa a tu aplicación.
Cada proyecto que terminas y despliegas es evidencia concreta para un empleador. Un repositorio en GitHub con una URL activa vale más que cualquier descripción en un currículum.
La diferencia entre un desarrollador que aprende y uno que trabaja es simple: el segundo despliega.