Прокси с nodejs - PullRequest
       7

Прокси с nodejs

9 голосов
/ 25 сентября 2011

Я разрабатываю веб-приложение, против API. Поскольку API не работает в моей локальной системе, мне нужно прокси-запрос, чтобы я не работал в междоменных проблемах. Есть ли простой способ сделать это, так что мой index.html будет отправлять с локального и все другие запросы GET, POST, PUT, DELETE перейдите на xyz.net/apiEndPoint.

Edit:

это мое первое решение, но оно не сработало

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
    });

});

Он будет обслуживать файлы index, js, css, но не будет перенаправлять остальное на внешний API. Это сообщение об ошибке, которое я получил:

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 ]

5 голосов
/ 25 сентября 2011

Взгляните на readme для http-proxy.В нем приведен пример вызова proxyRequest:

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

На основании сообщения об ошибке звучит, как будто вы передаете поддельное доменное имя в метод proxyRequest.

2 голосов
/ 07 марта 2014

Другие ответы немного устарели.

Вот как использовать http-proxy 1.0 с 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' });
});
1 голос
/ 04 июня 2014

Вот пример прокси, который может изменять тело запроса / ответа.

Он оценивает модуль through, который реализует прозрачный поток чтения / записи.

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);
0 голосов
/ 01 марта 2014

Может быть, вы должны посмотреть на мой ответ здесь .Здесь я использую пакет запросов для передачи каждого запроса прокси-серверу и передачи ответа обратно запрашивающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...