es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Enrutamiento de subdominios a un puerto específico en Node.js

Tengo dos servidores front-end de React (ejemplo1 y ejemplo2) escuchando en dos puertos en MyDomain.com:
MyDomain.com:4000 accede a ejemplo1
MyDomain.com:5000 accede a ejemplo2

Tengo dos subdominios, ejemplo1.MyDomain.com y ejemplo2.MyDomain.com
Quiero crear un tercer servidor de Nodejs que escuche en el puerto 3000 y enlace las solicitudes a los puertos 4000 y 5000 dependiendo del subdominio al que se acceda.
ejemplo1.MyDomain.com se enrutaría a MyDomain.com:4000
y
ejemplo2.MyDomain.com se enrutaría a MyDomain.com:5000

No pude encontrar un ejemplo que aborde los números de puerto, excepto para ngnix.
También intenté usar middleware de proxy, pero los ejemplos muestran cómo enrutar según el sufijo después del .com y eso no es lo que necesito.
Gracias por cualquier ayuda,
Amnon

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, puedes utilizar el módulo incorporado http en Node.js para crear un servidor que escuche en el puerto 3000. Luego puedes utilizar el módulo url para analizar la solicitud entrante y extraer el subdominio. Basándote en el subdominio, puedes utilizar nuevamente el módulo http para realizar solicitudes a los puertos apropiados (4000 o 5000 en este caso) y reenviar la respuesta al cliente.

    Aquí tienes un ejemplo de código para comenzar:

    const http = require('http');
    const url = require('url');
    
    const puertoEjemplo1 = 4000;
    const puertoEjemplo2 = 5000;
    
    const servidor = http.createServer((req, res) => {
      const subdominio = url.parse(req.headers.host).hostname.split('.')[0];
    
      if (subdominio === 'ejemplo1') {
        const opciones = {
          hostname: 'MiDominio.com',
          puerto: puertoEjemplo1,
          ruta: req.url,
          método: req.method,
          encabezados: req.headers,
        };
        const solicitudProxy = http.request(opciones, (respuestaProxy) => {
          res.writeHead(respuestaProxy.statusCode, respuestaProxy.headers);
          respuestaProxy.pipe(res);
        });
        req.pipe(solicitudProxy);
      } else if (subdominio === 'ejemplo2') {
        const opciones = {
          hostname: 'MiDominio.com',
          puerto: puertoEjemplo2,
          ruta: req.url,
          método: req.method,
          encabezados: req.headers,
        };
        const solicitudProxy = http.request(opciones, (respuestaProxy) => {
          res.writeHead(respuestaProxy.statusCode, respuestaProxy.headers);
          respuestaProxy.pipe(res);
        });
        req.pipe(solicitudProxy);
      } else {
        res.writeHead(404);
        res.end();
      }
    });
    
    servidor.listen(3000, () => {
      console.log('Servidor escuchando en el puerto 3000');
    });
    

    En este código, primero extraemos el subdominio de la URL de la solicitud utilizando el módulo url. Luego comprobamos si el subdominio es ejemplo1 o ejemplo2. Si es así, creamos un nuevo objeto de solicitud utilizando el módulo http y configuramos sus propiedades hostname, puerto, ruta, método y encabezados en función de la solicitud original. Luego direccionamos la solicitud original a esta nueva solicitud y direccionamos la respuesta desde el servidor en el puerto especificado de vuelta al cliente.

    Ten en cuenta que este es solo un ejemplo básico y es posible que no funcione en todas las situaciones. Es posible que debas manejar errores, tiempo de espera y otros problemas que puedan surgir al reenviar solicitudes. Además, si tienes un gran número de subdominios o puertos para manejar, este enfoque puede volverse difícil de mantener. En tales casos, es posible que desees considerar el uso de una solución más robusta como nginx o un equilibrador de carga dedicado.

Comments are closed.