在Nodejs中的response.write失败

时间:2011-02-14 11:06:05

标签: node.js caching buffer

我正在尝试创建一个从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有时为true,然后是其他缓存块的false,而如果我直接发送没有缓存的响应,则所有块的response.write都为真。

如果有人注意到我的错误,我正在或者确实知道一种更好的方法来缓存数据(最好是二进制文件,以便将所有非ASCII字符缓存到)。

2 个答案:

答案 0 :(得分:0)

如果您尝试在node.js中代理请求,则应尝试使用https://github.com/nodejitsu/node-http-proxy,这将为您节省大量时间和麻烦。

答案 1 :(得分:0)

在最新版本的Node.js(v 0.4.0)中,解决了从缓冲区写入响应的问题。所以只需更新到这个版本我的问题就解决了。

但是,必须知道response.write可能仍然给出错误,但这并不意味着它不会被发送,而是直接发送(漏桶概念)。这是我能够从node.js库中的注释中得出的结论(我希望我是正确的)。