2011-02-14 42 views
2

我試圖讓代理服務器從www.xxx.com中獲取一個頁面,例如緩存響應,然後將它發送到請求瀏覽器。Node.js中的response.write失敗

爲此,在服務器上,我創建了一個請求來自xxx.com的頁面的HTTP客戶端。響應以塊(Buffers)的形式返回。然後,由於塊的數量根據網頁而不同,因此我將這些塊放入一個緩衝區數組中。然後我發送數組的元素。

我的問題不是所有的塊都發送成功。有沒有其他方式可以在發送數據之前緩存數據? (我知道我可以直接發送數據,但我需要發送的緩存,而不是因爲我想將它發送給多個瀏覽器)

要保存塊使用:

function getURL(u) { 
    u = url.parse(u); 
    var client = http.createClient(u.port || 80, u.hostname); 
    var request = client.request('GET', '/', { 
          'Host': u.hostname, 
         }); 
    var cache ={ }; 
    cache.data = []; 

    request.end(); 
    request.on('response', function(response) { 
      cache.statusCode = response.statusCode; 
      cache.headers = response.headers; 

      response.on('data', function(chunk) { 
       cache.data.push(chunk); 
    } 
} 

到發送緩存中,我使用:

function sendCache(response, cache) { 
    var writeSuccess = []; 
    response.writeHead(cache.statusCose, cache.headers); 
    for (var i in cache.data) { 
     // don't encode the data, leave it as it is 
     writeSuccess[i] = response.write(cache.data[i], "binary"); 
     console.log("chunk " + i + " is of length " 
      + cache.data[i].length + ". Response success: " + writeSuccess[i]); 
    } 
} 

這裏我日誌response.write的返回值來檢查它是否成功與否。在node.js API中,沒有解釋這個函數是否返回某個東西,但我只是試了一下。

我注意到,response.write有時是真的,然後對其他塊的緩存是錯誤的,而如果我直接發送沒有緩存的響應,所有塊的response.write是真實的。

如果有人發現有問題,我正在做或者知道更好的方法來緩存數據(最好是二進制的,以便所有的非ASCII字符都會被緩存到)。

回答

0

在最新版本的Node.js(v 0.4.0)中,解決了從緩衝區寫入響應的問題。所以只要更新到這個版本,我的問題就解決了。

但是,人們必須知道response.write仍然可能會給出錯誤,但這並不意味着它不會被髮送,而是不會直接發送(漏斗概念)。這是我能夠從node.js庫中的評論得出的結論(我希望我是正確的)。

0

如果您嘗試在node.js中代理請求,您應該嘗試使用https://github.com/nodejitsu/node-http-proxy,它會爲您節省大量時間和頭痛。

+0

感謝Jim的建議,實際上我關心緩存事情,因爲我想將它發送給多個客戶端。所以它不僅是代理。 – sabah 2011-03-02 10:21:51