2013-03-26 32 views
7

因此,在此(簡化)代碼位中,當有人點擊我的節點服務器時,我向另一個網站發出GET請求並將HTML頁面標題打印到控制檯。工作正常:如何使用Node.js中的http.request限制響應長度

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電影文件或任何其他。不好。內容長度標題無法用於停止此操作,因爲它不會被所有服務器傳送。那麼問題:

我該如何告訴它在接收到第一個10KB之後停止GET請求?

乾杯!

+0

如何檢查內容類型/ MIME類型? – Amberlamps 2013-03-26 11:46:19

+0

可以這樣做,但是像內容長度,它不是一個可靠的指標 - 我提出請求的服務器仍然可以在技術上發送任何長度的數據。 ......無論如何我都明白!當然,在身體的第一個10K之後肯定有一種「掛斷」的方式。 – BaronVonKaneHoffen 2013-03-26 11:52:23

+0

您可能需要考慮的另一種方法是使用流並將它們傳回給客戶端,以避免緩衝整個響應。 http://docs.nodejitsu.com/articles/advanced/streams/how-to-use-stream-pipe – 2013-03-26 13:15:41

回答

13

一旦您已經閱讀足夠的數據,你可能放棄要求:

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字節中止請求,因爲該數據在不同大小的塊到達。

+0

啊哈!這就是我需要的。非常感謝:) – BaronVonKaneHoffen 2013-03-26 13:26:10

+0

你能清楚我一件事嗎?我通過在「str + = chunk」之前添加一個console.log('something)來檢查,它只記錄一次,但我確定我正在接收多個數據塊,因此在這種情況下它應該記錄多次。 – Devasish 2017-04-26 11:25:12

+0

@Devasish是的,你會期望如此,除非你使用相同的代碼作爲我的回答,並且請求被中止? – robertklep 2017-04-26 11:40:35