2014-02-24 101 views
0

注意:我的問題可能與this question非常相似,但該解決方案對我無效。使用節點連接的HTTP代理

我的問題與原始海報相同。我需要訪問一個外部資源,我需要代理它來解決跨域安全限制。我還引用了這個示例博客文章:http://nthloop.com/blog/local-dev-with-nodejs-proxy/

該代理正在加載外部資源(任何包含'cgi'的url)。但是通過這段代碼,我無法通過連接模塊來訪問本地(靜態)文件。超時,沒有錯誤消息,等...

我張貼我的server.js文件的全碼:

var httpProxy = require('http-proxy'); 
var connect = require('connect'); 
var endpoint = { 
     host: '11.0.0.120', 
     port: 8081 
    }; 

var proxy = new httpProxy.RoutingProxy(); 
var app = connect() 
    .use(function(req, res) { 
     if (req.url.indexOf('cgi') >= 0) { 
      proxy.proxyRequest(req, res, endpoint); 
     } else {connect.static(__dirname)}; 
    }) 
    .use(connect.static(__dirname)) 
    .listen(8182); 

This question的解決方案似乎說明,我需要包括其他條件。沒有或沒有一個,它不會起作用。

感謝您的幫助!

回答

0

您可以使用next()的讓請求流至下一個中間件 -

var app = connect() 
    .use(function(req, res, next) { 
     if (req.url.indexOf('cgi') >= 0) { 
      proxy.proxyRequest(req, res, endpoint); 
     } else { 
      next(); 
     )}; 
    }) 
    .use(connect.static(__dirname)) 
    .listen(8182); 
+0

謝謝。我確實嘗試過,並沒有奏效。如果我錯誤輸入了某些內容,我會再試一次。 – Jason

+0

原來我沒有添加** next **參數!我只是再看一遍,它現在正在工作。謝謝! – Jason

0

糟糕,只需將使用(connect ...)功能交換到第一個調用即可使用。不知道爲什麼這會起作用,或者它是最好的方法。另外,不需要else語句。

如果有人能給出更好的解釋我可以接受他們的答案。這是我的工作代碼:

var httpProxy = require('http-proxy'); 
var connect = require('connect'); 
var endpoint = { 
     host: '11.0.0.120', 
     port: 8081 
    }; 

var proxy = new httpProxy.RoutingProxy(); 
var app = connect() 
    .use(connect.static(__dirname)) 
    .use(function(req, res) { 
     if (req.url.indexOf('cgi') >= 0) { 
      proxy.proxyRequest(req, res, endpoint); 
     } 
    }) 
    .listen(8182); 
+0

,如果你的任何靜態文件路徑中有「CGI」這是不行的。您應該首先篩選出代理請求,然後將其他請求傳遞給靜態中間件。 –

+0

我不太瞭解你的評論。如果任何靜態文件中有'cgi',你的發佈的解決方案也不會工作,對吧?這是設計。你的意思是,在我的解決方案中,具有'CGI'的靜態文件將優先,在你的代理流量優先? – Jason