开发者

Proxy with nodejs

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜