Para evitar problemas de AJAX en el mismo dominio, quiero que mi servidor web node.js reenvíe todas las solicitudes de URL /api/BLABLA
a otro servidor, por ejemplo other_domain.com:3000/BLABLA
, y devuelva al usuario lo mismo que devolvió este servidor remoto, de forma transparente.
Todas las demás URL (al lado /api/*
) se deben servir directamente, sin proxy.
¿Cómo logro esto con node.js + express.js? ¿Puedes dar un ejemplo de código simple?
(tanto el servidor web como el 3000
servidor remoto están bajo mi control, ambos ejecutan node.js con express.js)
Hasta ahora encontré este https://github.com/http-party/node-http-proxy , pero leer la documentación allí no me hizo más sabio. Terminé con
var proxy = new httpProxy.RoutingProxy();
app.all("/api/*", function(req, res) {
console.log("old request url " + req.url)
req.url = '/' + req.url.split('/').slice(2).join('/'); // remove the '/api' part
console.log("new request url " + req.url)
proxy.proxyRequest(req, res, {
host: "other_domain.com",
port: 3000
});
});
pero no se devuelve nada al servidor web original (o al usuario final), así que no tuvimos suerte.
fuente
Respuestas:
Quieres usar
http.request
para crear una solicitud similar a la API remota y devolver su respuesta.Algo como esto:
Aviso: Realmente no he probado lo anterior, por lo que podría contener errores de análisis, con suerte, esto le dará una pista sobre cómo hacerlo funcionar.
fuente
Cannot render headers after they are sent to the client
Archivo
Hice algo similar pero usé request en su lugar:
Espero que esto ayude, me tomó un tiempo darme cuenta de que podía hacer esto :)
fuente
Encontré una solución más corta y sencilla que funciona a la perfección, y también con autenticación, usando
express-http-proxy
:Y luego simplemente:
Nota: como lo menciona @MaxPRafferty, use
req.originalUrl
en lugar debaseUrl
para preservar la cadena de consulta:Actualización: como mencionó Andrew (¡gracias!), Hay una solución preparada que utiliza el mismo principio:
Y entonces:
Documentación: http-proxy-middleware en Github
Sé que llego tarde a unirme a esta fiesta, pero espero que esto ayude a alguien.
fuente
Para extender la respuesta de trigoman (créditos completos para él) para trabajar con POST (también podría hacer que funcione con PUT, etc.):
fuente
if(req.method === 'PUT'){ r = request.put({uri: url, json: req.body}); }
Utilicé la siguiente configuración para dirigir todo
/rest
a mi servidor back-end (en el puerto 8080), y todas las demás solicitudes al servidor frontend (un servidor webpack en el puerto 3001). Admite todos los métodos HTTP, no pierde ninguna metainformación de solicitud y admite sockets web (que necesito para la recarga en caliente)fuente
Primero instale express y http-proxy-middleware
Luego en su server.js
En este ejemplo, servimos el sitio en el puerto 3000, pero cuando una solicitud finaliza con / api, lo redirigimos a localhost: 8080.
http: // localhost: 3000 / api / login redirige a http: // localhost: 8080 / api / login
fuente
Ok, aquí hay una respuesta lista para copiar y pegar usando el módulo require ('request') npm y una variable de entorno * en lugar de un proxy codificado):
coffeescript
javascript:
fuente
Encontré una solución más corta que hace exactamente lo que quiero https://github.com/http-party/node-http-proxy
Después de instalar
http-proxy
Úselo como a continuación en su servidor / index / app.js
Realmente he pasado días buscando en todas partes para evitar este problema, probé muchas soluciones y ninguna funcionó excepto esta.
Espero que ayude a alguien más también :)
fuente
No tengo una muestra exprés, pero una simple
http-proxy
paquete . Una versión muy simple del proxy que utilicé para mi blog.En resumen, todos los paquetes proxy proxy de nodejs funcionan en el nivel de protocolo http, no en el nivel tcp (socket). Esto también es cierto para express y todos los middleware express. Ninguno de ellos puede hacer proxy transparente, ni NAT, lo que significa mantener la IP de la fuente de tráfico entrante en el paquete enviado al servidor web de fondo.
Sin embargo, el servidor web puede recoger la IP original de los encabezados http x-reenviados y agregarla al registro.
La función
xfwd: true
deproxyOption
activación de encabezado x-forward parahttp-proxy
.Referencia para el encabezado X-Fordered: https://en.wikipedia.org/wiki/X-Forwards-For
Versión completa de mi proxy: https://github.com/J-Siu/ghost-https-nodejs-proxy
fuente