Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Node.js中的http.request限制响应长度_Node.js_Http - Fatal编程技术网

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

如何使用Node.js中的http.request限制响应长度,node.js,http,Node.js,Http,因此,在这段(简化的)代码中,当有人点击我的节点服务器时,我向另一个网站发出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:

因此,在这段(简化的)代码中,当有人点击我的节点服务器时,我向另一个网站发出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请求?


干杯

读取足够的数据后,可以中止请求:


这将中止大约10000字节的请求,因为数据以不同大小的块到达。

检查内容类型/mime类型如何?我想可以,但与内容长度一样,它不是一个可靠的指标-我向其发出请求的服务器在技术上仍然可以发送任意长度的数据。。。反正我也明白!当然,在第一个10K的身体之后,肯定会有一种“挂起”的方法。你可能想考虑的另一种方法是使用流并将它们返回给客户端,这样它们就不会缓冲整个响应。啊哈!这就是我需要的。非常感谢:)你能帮我澄清一件事吗?我已经通过在“str+=chunk”之前添加一个console.log('something')进行了检查,它只记录了一次,但我确信我正在接收多个数据块,因此在这种情况下它应该记录多次…@Devasish是的,你会这样想,除非你使用与我的答案相同的代码,并且请求被中止?
  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();