2011-09-26 72 views
22

我已經用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響應,也許有一個迴應,但我不的上前瀏覽器。

回答

92

piperequest -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); 
+0

任何機會,你可以解釋'req.pipe(request(url))。pipe(res);'?爲什麼需要兩個「管道」? – Jonathan

+3

當請求有json內容類型時,'pipe'行會掛起 - 請參見[this question](http://stackoverflow.com/questions/26121830/proxy-json-requests-with-node-express) – Jonathan

+0

爲什麼不使用'request(url).pipe(res);'as [這裏建議](http://stackoverflow.com/a/16924410/348545) – Jonathan

7

也許你的代碼是不同的,當你正在測試,但我使用查詢網址相同的代碼示例如下:

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

好吧,改變端口工作爲我的項目很好,但不幸的是我從服務器上得到了404。在瀏覽器中調用相同的URL。 –

4

也許我以錯誤的方式使用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) 
      }); 

});