Proxy with nodejs

2019-03-26 17:13发布

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"}

4条回答
Summer. ? 凉城
2楼-- · 2019-03-26 17:18

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.

查看更多
萌系小妹纸
3楼-- · 2019-03-26 17:27

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);
查看更多
Explosion°爆炸
4楼-- · 2019-03-26 17:30

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.

查看更多
Melony?
5楼-- · 2019-03-26 17:42

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' });
});
查看更多
登录 后发表回答