I develop an webapp, against an api. As the api is not running on my local system, I need to proxy the request so I dont run in cross domain issues. Is there an easy way to do this so my index.html will send from local and all other GET, POST, PUT, DELETE request go to xyz.net/apiEndPoint.
Edit:
this is my first solution but didnt work
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
});
});
It will serve the index, js, css files but dont route the rest to the external api. This is the error message I've got:
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"}
Take a look at the readme for http-proxy
. It has an example of how to call proxyRequest
:
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 9000
});
Based on the error message, it sounds like you're passing a bogus domain name into the proxyRequest
method.
Other answers are slightly outdated.
Here's how to use http-proxy 1.0 with express:
var httpProxy = require('http-proxy');
var apiProxy = httpProxy.createProxyServer();
app.get("/api/*", function(req, res){
apiProxy.web(req, res, { target: 'http://google.com:80' });
});
Here is an example of the proxy which can modify request/response body.
It evaluates through
module which implements transparent read/write stream.
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);
Maybe you should look at my answer here. Here I use the request package to pipe every request to a proxy and pipe the response back to the requester.