例如,我试图制作一个从www.xxx.com获取页面的代理服务器,缓存响应,然后将其发送到请求的浏览器。
为此,我在服务器上创建了一个从xxx.com请求页面的HTTP。响应以块(缓冲区)的形式返回。然后,由于块的数量根据网页的不同而不同,所以我将这些块放入一个缓冲区数组中。然后我发送数组的元素。
我的问题不是所有的块都被成功地发送了。在发送数据之前,还有其他方法可以缓存数据吗?(我知道我可以直接发送数据,但是我需要发送缓存,因为我想将它发送到多个浏览器)
为了保存我使用的块:
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字符都会被缓存到)。
发布于 2011-03-02 10:26:03
在Node.js的最新版本(V0.4.0)中,解决了从缓冲区写入响应的问题。所以,只要更新到这个版本,我的问题就解决了。
然而,我们必须知道,response.write仍然可能给出错误,但这并不意味着它没有发送,但没有直接发送(漏桶概念)。这就是我从node.js库中的评论中得出的结论(希望我是对的)。
发布于 2011-02-18 01:47:41
如果您试图在node.js中代理请求,您应该尝试使用https://github.com/nodejitsu/node-http-proxy,这将节省大量时间和麻烦。
https://stackoverflow.com/questions/4991409
复制相似问题