如何在Node.js中使用http.request限制响应长度

10

所以在这段(简化的)代码中,当有人访问我的节点服务器时,我向另一个网站发出GET请求并将HTML页面标题打印到控制台。工作正常:

var http = require("http");
var cheerio = require('cheerio');

var port = 8081;
s = http.createServer(function (req, res) {
var opts = {
    method: 'GET',
    port: 80,
    hostname: "pwoing.com",
    path: "/"
};
http.request(opts, function(response) {
    console.log("Content-length: ", response.headers['content-length']);
    var str = '';
    response.on('data', function (chunk) {
        str += chunk;
    });
    response.on('end', function() {
        dom = cheerio.load(str);
        var title = dom('title');
        console.log("PAGE TITLE: ",title.html());
    });
}).end();
res.end("Done.");
}).listen(port, '127.0.0.1');

然而,在实际应用中,用户可以指定要访问的URL。这意味着我的节点服务器可能会下载20GB的电影文件或其他内容,这并不好。Content-length头也不能阻止这种情况,因为它并未被所有服务器传输。那么问题来了:

我该如何告诉它在接收到前10KB后停止GET请求呢?

谢谢!


检查内容类型/媒体类型怎么样? - Amberlamps
可能可以这样做,但是像content-length一样,它并不是一个可靠的指标 - 我发出请求的服务器在技术上仍然可以发送任意长度的数据。至少我是这样理解的!肯定有一种方法可以在第一个10K的正文后就“挂断”连接。 - BaronVonKaneHoffen
另一种你可能想考虑的方法是使用流并将它们作为管道返回给客户端,以便在响应时不缓冲整个响应。http://docs.nodejitsu.com/articles/advanced/streams/how-to-use-stream-pipe - Hector Correa
1个回答

17

一旦您已经阅读了足够的数据,您可以中止请求:

  http.request(opts, function(response) {
    var request = this;
    console.log("Content-length: ", response.headers['content-length']);
    var str = '';
    response.on('data', function (chunk) {
      str += chunk;
      if (str.length > 10000)
      {
        request.abort();
      }
    });
    response.on('end', function() {
      console.log('done', str.length);
      ...
    });
  }).end();
这将在数据以不同大小的块到达时,在大约10,000个字节处中止请求。

around需保留。

啊哈!这正是我需要的。非常感谢 :) - BaronVonKaneHoffen
你能帮我澄清一件事吗?我已经添加了一个console.log('something')在"str += chunk"之前进行检查,它只记录了一次,但我确定我收到了多个数据块,所以在这种情况下它应该记录多次... - Devasish
@Devasish 是的,你应该期望如此,除非你正在使用与我的答案相同的代码并且请求被中止了? - robertklep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接