Por qué localhost es una prisión y cómo escapar de ella
\n\nUsted inicia un servidor en localhost:3000, 127.0.0.1:5173 o [::1]:8080 — todo funciona perfectamente. Hasta que le pide a un colega o amigo que abra su proyecto. Y entonces comienza: «Página no disponible», «Connection refused», «ERR_CONNECTION_REFUSED». ¿Le suena familiar?
El problema es que localhost (o 127.0.0.1) es una interfaz de bucle invertido. Su servidor solo escucha en ella. Es como gritar en una habitación vacía: usted se oye a sí mismo, pero nadie desde fuera lo oye. En este artículo, veremos cómo convertir un servidor local en público (o al menos accesible en la red local) con TypeScript. Sin magia, solo métodos probados.
Responderemos a las preguntas más frecuentes de Stack Overflow (donde este tema ha acumulado miles de visitas) y proporcionaremos soluciones listas para usar para Express, Node.js y Vite.
\n\n1. Conceptos básicos: ¿qué significa «escuchar en todas las interfaces»?
\n\nCuando escribe app.listen(3000) en Express, el servidor por defecto solo escucha en localhost. Para permitir el acceso desde el exterior, debe especificar 0.0.0.0 (todas las interfaces IPv4) o :: (todas las IPv6).
Así es como se ve en TypeScript:
\n\nimport express from 'express';\n\nconst app = express();\nconst PORT = 3000;\n\n// Escuchamos en todas las interfaces\napp.listen(PORT, '0.0.0.0', () => {\n console.log(`Server is running on http://0.0.0.0:${PORT}`);\n console.log(`Disponible en la red local a través de su IP`);\n});\n\n\nAhora el servidor no solo es accesible en localhost, sino también a través de la IP local de su computadora (por ejemplo, 192.168.1.10:3000).
¿Cómo saber su IP local?
\n- \n
- Windows:
ipconfig→ busque la dirección IPv4 \n - macOS/Linux:
ifconfigoip addr→ líneainet 192.168.x.x\n
Pero esto es solo el primer paso. A menudo el problema es más profundo: el firewall, CORS o que el servidor aún no responde desde otros dispositivos.
\n\n2. CORS: ¿por qué el navegador bloquea las solicitudes?
\n\nIncluso si ha abierto el acceso a través de la red, el navegador puede bloquear las solicitudes desde otro dominio. Esto es la política de CORS (Cross-Origin Resource Sharing). La solución es configurar los encabezados en el servidor.
\n\nInstale el paquete cors para Express:
npm install cors\nnpm install @types/cors --save-dev\n\n\nConéctelo en el servidor TypeScript:
\n\nimport express from 'express';\nimport cors from 'cors';\n\nconst app = express();\n\n// Permitimos todos los orígenes (para desarrollo)\napp.use(cors({\n origin: '*',\n methods: ['GET', 'POST', 'PUT', 'DELETE'],\n allowedHeaders: ['Content-Type', 'Authorization']\n}));\n\napp.listen(3000, '0.0.0.0', () => {\n console.log('CORS activado, servidor accesible desde el exterior');\n});\n\n\nImportante: En producción no use origin: '*' — especifique dominios concretos.
3. Firewall: el bloqueador invisible
\n\nIncluso si el servidor escucha en 0.0.0.0, su firewall (cortafuegos) puede bloquear las conexiones entrantes. Esta es una causa común por la que el acceso desde el exterior no funciona.
Cómo abrir un puerto (ejemplo en Windows):
\n- \n
- Abra el «Firewall de Windows Defender» \n
- Haga clic en «Configuración avanzada» \n
- Cree una regla para conexión entrante \n
- Especifique el puerto (por ejemplo, 3000) y el protocolo (TCP) \n
- Permita la conexión \n
En macOS/Linux use ufw o iptables:
# Permitir el puerto 3000 a través de ufw\nsudo ufw allow 3000/tcp\n\n\n