Нет ответа при использовании экспресс-прокси - PullRequest
27 голосов
/ 26 сентября 2011

Я написал небольшой прокси с nodejs, express и htt-proxy.Он хорошо работает для обслуживания локальных файлов, но не работает, когда дело доходит до прокси для внешнего API:

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) {
    req.url = 'v1/public/yql?q=show%20tables&format=json&callback=';
    proxy.proxyRequest(req, res, {
        host: 'query.yahooapis.com', //yahoo is just an example to verify its not the apis fault
        port: 8080
    });

});

Проблема в том, что нет ответа от API Yahoo, возможно, есть ответ, но я не пришелв браузере.

Ответы [ 4 ]

106 голосов
/ 12 декабря 2013

Еще проще с pipe и request -Package

var request = require('request');

app.use('/api', function(req, res) {
  var url = apiUrl + req.url;
  req.pipe(request(url)).pipe(res);
});

Он направляет весь запрос в API и передает ответ обратно запрашивающей стороне.Это также обрабатывает POST / PUT / DELETE и все другие запросы.

7 голосов
/ 27 сентября 2011

Может быть, ваш код отличается при тестировании, но я запрашиваю тот же URL, что и в вашем примере кода, используя следующее:

http://query.yahooapis.com:8080/v1/public/yql?q=show%20tables&format=json&callback=

и я ничего не получаю обратно. Я думаю, вы хотите изменить порт на 80 (с 8080) - он работает, когда я меняю его так:

http://query.yahooapis.com:80/v1/public/yql?q=show%20tables&format=json&callback=

Значит, это должно быть:

proxy.proxyRequest(req, res, {
    host: 'query.yahooapis.com', //yahoo is just an example to verify its not the apis fault
    port: 80
});
4 голосов
/ 09 октября 2011

Возможно, я неправильно использую http-прокси. Использование рестлера делает то, что я хочу:

var express = require('express'),
    app = express.createServer(),
    restler = require('restler');


app.use(express.bodyParser());
app.listen( 1234);



app.get('/', function(req, res) {
    console.log(__dirname + '/index.html')
    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) {

    restler.get('http://myUrl.com:80/app_test.php/api' + req.url, {

        }).on('complete', function (data) {
                console.log(data)
               res.json(data)
            });

});
0 голосов
/ 18 апреля 2019

Я использовал http-proxy-middleware .

Код выглядит примерно так:

var express = require("express");
var proxy = require("http-proxy-middleware");

const theProxy = proxy({
  target: "query.yahooapis.com",
  changeOrigin: true,
});

app.use("/", theProxy);
app.listen(process.env.PORT || 3002);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...