我試圖讓代理服務器從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字符都會被緩存到)。
感謝Jim的建議,實際上我關心緩存事情,因爲我想將它發送給多個客戶端。所以它不僅是代理。 – sabah 2011-03-02 10:21:51