2011-09-26 122 views
3

我有一個node.js應用程序提供靜態文件(html,js,css)。在靜態文件中,完成了一些ajax請求(在請求中使用/ TEST)。我需要將這些請求代理到在localhost上運行的另一臺服務器:213445。靜態頁面顯示正常,但,當涉及到代理的請求時,它永遠掛...nodejs代理沒有響應

我的代碼是:

var express = require("express"); 
var httpProxy = require('http-proxy'); 
var fs = require('fs'); 

// Create https server 
var app = express.createServer({ 
    key: fs.readFileSync('privatekey.pem'), 
    cert: fs.readFileSync('certificate.pem') 
}); 

// Handle static files 
app.use(express.static(__dirname + '/public')); 

// Proxy request 
app.all('/TEST/*',function(req, res){ 
    // Remove '/TEST' part from query string 
    req.url = '/' + req.url.split('/').slice(2).join('/'); 

    // Create proxy 
    var proxy = new httpProxy.HttpProxy(); 
    proxy.proxyRequest(req, res, { 
    host: 'localhost', 
    port: 21345, 
    enableXForwarded: false, 
    buffer: proxy.buffer(req) 
    }); 
}); 

// Run application 
app.listen(10443); 

回答

2

我有同樣的問題。如果你註釋掉

​​

你會看到代理工作。

不知道如何解決它,如果express.static使用

Marak大地主迴應了錯誤report

這是一個明確的問題。 Connect/Express中間件正在爲您的響應對象做非標準的事情, 中斷流。嘗試使用原始request模塊而不是http-proxy。 如果您需要正確的中間件堆棧,檢查出https://github.com/flatiron/union

+0

事實上,經過一段時間後,我決定採取相反的行動。如果請求了靜態文件,Nginx將爲它們提供服務。如果請求一些動態文件,那麼Nginx將它們代理到我的node.js應用程序。我認爲這是更多Nginx的工作來提供靜態文件。 – Luc

+0

現在有同樣的問題並使用相同的解決方案。仍然討厭使用靜態代碼破壞代理 –

2

由於對HTTP代理issue 180故障描述是與上面提到的連接完成的非標準化的東西:

使用NPM安裝連接-restreamer使這個最後的項目在你的快遞app.configuration:

app.use(require('connect-restreamer')()); 

然後做這樣的事情:

var httpProxy = require('http-proxy'); 
var routingProxy = new httpProxy.RoutingProxy(); 

app.get('/proxy/', function (req, res) { 
    routingProxy.proxyRequest(req, res, { 
    target: { 
     host : host, 
     port : port 
    } 
    }); 
}) 

這會將整個URL(包括「/ proxy /」)傳遞到目標主機。你可以在rewrite/modify the headers of the req之前,如果你進入proxyRequest()想要模仿來自特定CNAME虛擬主機或不同URL字符串的請求。