2011-09-25 23 views
8

Desarrollo una aplicación web, en contra de una API. Como la API no se está ejecutando en mi sistema local, necesito enviar un proxy a la solicitud para que no se ejecute en problemas de dominio cruzado. ¿Hay una manera fácil de hacer esto para que mi index.html envíe desde local y todas las demás solicitudes GET, POST, PUT, DELETE vayan a xyz.net/apiEndPoint.Proxy con nodejs

Editar:

esta es la primera solución, pero no funcionó

var express = require('express'), 
    app = express.createServer(), 
    httpProxy = require('http-proxy'); 


app.use(express.bodyParser()); 
app.listen(process.env.PORT || 1235); 

var proxy = new httpProxy.RoutingProxy(); 

app.get('/', function(req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 
app.get('/js/*', function(req, res) { 
    res.sendfile(__dirname + req.url); 
}); 
app.get('/css/*', function(req, res) { 
    res.sendfile(__dirname + req.url); 
}); 

app.all('/*', function(req, res) { 
    proxy.proxyRequest(req, res, { 
     host: 'http://apiUrl', 
     port: 80 
    }); 

}); 

Servirá el índice, js, css, pero te ruta para el resto de la API externa. Este es el mensaje de error Tengo:

An error has occurred: {"stack":"Error: ENOTFOUND, Domain name not found\n at IOWatcher.callback (dns.js:74:15)","message":"ENOTFOUND, Domain name not found","errno":4,"code":"ENOTFOUND"} 

Respuesta

4

Tome un vistazo a la readme for http-proxy. Tiene un ejemplo de cómo llamar a proxyRequest:

proxy.proxyRequest(req, res, { 
    host: 'localhost', 
    port: 9000 
}); 

Basado en el mensaje de error, parece que estás pasando un nombre de dominio falso en el método proxyRequest.

+0

Tienes razón el anfitrión comienza con 'http: //'. Al eliminar esto, corrígelo. Pero sé que tengo una respuesta vacía: HTTP/1.1 400 Bad Request X-Powered-By: Express servidor: Apache-Coyote/1.1 -longitud de contenido: 0 fecha: Dom, 25 Sep 2011 18:06: 22 GMT conexión: cerrar –

+0

@ AndreasKöberle, para empezar, sugiero que se corrija esta pregunta o se abra una nueva pregunta. –

+1

Ok, he hecho una nueva pregunta. http://stackoverflow.com/questions/7559862/proxy-with-nodejs-and-express –

0

Quizás deberías mirar mi respuesta here. Aquí utilizo el paquete de solicitud para canalizar cada solicitud a un proxy y enviar la respuesta al solicitante.

2

Otras respuestas están ligeramente desactualizadas.

Así es cómo utilizar http-proxy 1,0 con expreso:

var httpProxy = require('http-proxy'); 

var apiProxy = httProxy.createProxyServer(); 

app.get("/api/*", function(req, res){ 
    apiProxy.web(req, res, { target: 'http://google.com:80' }); 
}); 
1

Aquí se muestra un ejemplo de la representación que puede modificar cuerpo de la solicitud/respuesta.

Evalúa el módulo through que implementa la transmisión transparente de lectura/escritura.

var http = require('http'); 
var through = require('through'); 

http.createServer(function (clientRequest, clientResponse) { 

    var departureProcessor = through(function write(requestData){ 

     //log or modify requestData here 
     console.log("=======REQUEST FROM CLIENT TO SERVER CAPTURED========"); 
     console.log(requestData); 

     this.queue(requestData); 
    }); 

    var proxy = http.request({ hostname: "myServer.com", port: 80, path: clientRequest.url, method: 'GET'}, function (serverResponse) { 

     var arrivalProcessor = through(function write(responseData){ 

      //log or modify responseData here 
      console.log("======RESPONSE FROM SERVER TO CLIENT CAPTURED======"); 
      console.log(responseData); 

      this.queue(responseData); 
     }); 

     serverResponse.pipe(arrivalProcessor); 
     arrivalProcessor.pipe(clientResponse); 
    }); 

    clientRequest.pipe(departureProcessor, {end: true}); 
    departureProcessor.pipe(proxy, {end: true}); 

}).listen(3333);