Cómo revertir las solicitudes POST y PUT del cliente proxy mediante el nodo-http-proxy

Estoy tratando de usar el nodo-http-proxy como un proxy inverso, pero parece que no consigo que las solicitudes POST y PUT funcionen. El archivo server1.js es el proxy inverso (al menos para las solicitudes con la url “/ forward-this”) y server2.js es el servidor que recibe las solicitudes de proxy. Por favor explique lo que estoy haciendo incorrectamente.

Aquí está el código para server1.js:

// File: server1.js // var http = require('http'); var httpProxy = require('http-proxy'); httpProxy.createServer(function (req, res, proxy) { if (req.method == 'POST' || req.method == 'PUT') { req.body = ''; req.addListener('data', function(chunk) { req.body += chunk; }); req.addListener('end', function() { processRequest(req, res, proxy); }); } else { processRequest(req, res, proxy); } }).listen(8080); function processRequest(req, res, proxy) { if (req.url == '/forward-this') { console.log(req.method + ": " + req.url + "=> I'm going to forward this."); proxy.proxyRequest(req, res, { host: 'localhost', port: 8855 }); } else { console.log(req.method + ": " + req.url + "=> I'm handling this."); res.writeHead(200, { "Content-Type": "text/plain" }); res.write("Server #1 responding to " + req.method + ": " + req.url + "\n"); res.end(); } } 

Y aquí está el código para server2.js:

 // File: server2.js // var http = require('http'); http.createServer(function (req, res, proxy) { if (req.method == 'POST' || req.method == 'PUT') { req.body = ''; req.addListener('data', function(chunk) { req.body += chunk; }); req.addListener('end', function() { processRequest(req, res); }); } else { processRequest(req, res); } }).listen(8855); function processRequest(req, res) { console.log(req.method + ": " + req.url + "=> I'm handling this."); res.writeHead(200, { 'Content-Type': 'text/plain' }); res.write("Server #2 responding to " + req.method + ': url=' + req.url + '\n'); res.end(); } 

http-proxy depende de los data y eventos end para las solicitudes POST / PUT. La latencia entre el momento en que el servidor 1 recibe la solicitud y el momento en que se envía a un proxy significa que http-proxy pierde esos eventos por completo. Tiene dos opciones aquí para que esto funcione correctamente: puede amortiguar la solicitud o puede usar un proxy de enrutamiento en su lugar. El proxy de enrutamiento parece el más apropiado aquí, ya que solo necesita proxy un subconjunto de solicitudes. Aquí está la versión revisada de server1.js:

 // File: server1.js // var http = require('http'); var httpProxy = require('http-proxy'); var proxy = new httpProxy.RoutingProxy(); http.createServer(function (req, res) { if (req.url == '/forward-this') { return proxy.proxyRequest(req, res, { host: 'localhost', port: 8855 }); } if (req.method == 'POST' || req.method == 'PUT') { req.body = ''; req.addListener('data', function(chunk) { req.body += chunk; }); req.addListener('end', function() { processRequest(req, res); }); } else { processRequest(req, res); } }).listen(8080); function processRequest(req, res) { console.log(req.method + ": " + req.url + "=> I'm handling this."); res.writeHead(200, { "Content-Type": "text/plain" }); res.write("Server #1 responding to " + req.method + ": " + req.url + "\n"); res.end(); } 

Además de @squamos

¿Cómo escribir una aplicación de node express que sirva para la mayoría de los archivos locales, pero que redireccione a otros a otro dominio?

 var proxy = new httpProxy.RoutingProxy(); 

“El código anterior funciona para http-proxy ~ 0.10.x. Desde entonces, muchas cosas han cambiado en la biblioteca. A continuación, puede encontrar un ejemplo para una nueva versión (en el momento de escribir ~ 1.0.2)”

 var proxy = httpProxy.createProxyServer({}); 

Aquí está mi solución para las solicitudes POST proxy. Esta no es la solución más ideal, pero funciona y es fácil de entender.

 var request = require('request'); var http = require('http'), httpProxy = require('http-proxy'), proxy = httpProxy.createProxyServer({}); http.createServer(function(req, res) { if (req.method == 'POST') { request.post('http://localhost:10500/MyPostRoute', {form: {}}, function(err, response, body) { if (! err && res.statusCode == 200) { // Notice I use "res" not "response" for returning response res.writeHead(200, {'Content-Type': "application/json"}); res.end(body); } else { res.writeHead(404, {'Content-Type': "application/json"}); res.end(JSON.stringify({'Error': err})); } }); } else if (req.method == 'GET') { proxy.web(req, res, { target: 'http://localhost/9000' }, function(err) { console.log(err) }); } 

Los puertos 10500 y 9000 son arbitrarios y en mi código los asigno dinámicamente según los servicios que hospedé. Esto no trata con PUT y podría ser menos eficiente porque estoy creando otra respuesta en lugar de manipular la actual.