2013-03-26 5 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'); 

हालांकि, वास्तविक ऐप में, उपयोगकर्ता हिट करने के लिए एक यूआरएल निर्दिष्ट कर सकते हैं। इसका मतलब है कि मेरा नोड सर्वर 20 जीबी मूवी फाइलों या जो कुछ भी डाउनलोड कर सकता है। अच्छा नही। सामग्री-लंबाई शीर्षलेख को इसे रोकने के लिए कोई उपयोग नहीं है क्योंकि यह सभी सर्वरों द्वारा प्रेषित नहीं होता है। प्रश्न तब:

पहले 10 केबी प्राप्त होने के बाद, जीईटी अनुरोध को रोकने के लिए मैं इसे कैसे कह सकता हूं?

चीयर्स!

+0

सामग्री-प्रकार/माइम-प्रकार की जांच करने के बारे में कैसे? – Amberlamps

+0

मुझे लगता है कि, लेकिन सामग्री-लंबाई की तरह, यह एक विश्वसनीय संकेतक नहीं है - जिस सर्वर पर मैं अनुरोध कर रहा हूं वह तकनीकी रूप से डेटा की किसी भी लंबाई को भेज सकता है। ... जैसा कि मैं इसे समझता हूं! निश्चित रूप से शरीर के पहले 10 के बाद बस "लटकना" का एक तरीका होना चाहिए। – BaronVonKaneHoffen

+0

एक अन्य दृष्टिकोण जिसे आप विचार करना चाहते हैं, धाराओं का उपयोग करना और क्लाइंट को वापस पाइप करना है क्योंकि वे आते हैं ताकि आप पूरी प्रतिक्रिया को बफर न करें। http://docs.nodejitsu.com/articles/advanced/streams/how-to-use-stream-pipe –

उत्तर

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

+0

क्या आप मुझे एक चीज़ साफ़ कर सकते हैं? मैंने "str + = chunk" से पहले एक console.log ('कुछ) जोड़कर चेक किया है, यह केवल एक बार लॉगिंग कर रहा है, लेकिन मुझे यकीन है कि मुझे डेटा का एकाधिक हिस्सा मिल रहा है, इसलिए उस स्थिति में इसे कई बार लॉग करना चाहिए .. – Devasish

+0

@ देवासिश हां, आप उम्मीद करेंगे, जब तक कि आप मेरे उत्तर के समान कोड का उपयोग नहीं कर रहे हैं और अनुरोध निरस्त हो गया है? – robertklep

संबंधित मुद्दे