Нет ответа с использованием экспресс-прокси-маршрута
Я написал небольшой прокси с 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
});
});
Проблема в том, что от yahoo api нет ответа, возможно, есть ответ, но я не нашел его в браузере.
Ответы
Ответ 1
Еще проще с 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 и все остальные запросы \o/
Если вы также заботитесь о строке запроса, вы также должны ее пропустить
req.pipe(request({ qs:req.query, uri: url })).pipe(res);
Ответ 2
Возможно, ваш код отличается при тестировании, но я запрашиваю тот же 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
});
Ответ 3
Возможно, я использую http-proxy неправильно. Использование restler делает то, что я хочу:
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)
});
});
Ответ 4
Я закончил тем, что использовал 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);