没有使用快速代理路由的响应

And*_*rle 27 proxy node.js express

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

});
Run Code Online (Sandbox Code Playgroud)

问题是雅虎api没有回复,也许有回应,但我没有在浏览器中出现.

Ste*_*yer 110

使用piperequest-Package 更简单

var request = require('request');

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

它将整个请求传递给API,并将响应传递回请求者.这也处理POST/PUT/DELETE和所有其他请求\ o /

如果你也关心查询字符串,你也应该管它

req.pipe(request({ qs:req.query, uri: url })).pipe(res);
Run Code Online (Sandbox Code Playgroud)

  • 当请求具有json内容类型时,`pipe`行会挂起 - 请参阅[this question](http://stackoverflow.com/questions/26121830/proxy-json-requests-with-node-express) (3认同)
  • 如@Jonathan 的链接所示,如果内容类型为 JSON,则将 `json: true` 添加到 `request` 参数,使其变为: `req.pipe(request({ qs:req.query, uri: url , json: true })).pipe(res);` (3认同)

hro*_*oss 7

在测试时,您的代码可能不同,但我使用以下代码查询代码示例中的相同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
});
Run Code Online (Sandbox Code Playgroud)