2013-08-26 3 views
7

मेरे पास निम्न स्क्रिप्ट है और ऐसा लगता है कि नोड प्रतिक्रिया ऑब्जेक्ट में सामग्री-लंबाई शीर्षलेख शामिल नहीं है। मुझे डेटा लेने से पहले लंबाई जानने की जरूरत है और चूंकि डेटा काफी बड़ा हो सकता है, इसलिए मैं इसे बफर नहीं करना चाहूंगा।node.js में, मैं http.get() के जवाब में सामग्री-लंबाई शीर्षलेख कैसे प्राप्त करूं?

http.get('http://www.google.com', function(res){  

    console.log(res.headers['content-length']); // DOESN'T EXIST 
}); 

मैंने ऑब्जेक्ट पेड़ पर नेविगेट किया है और कुछ भी नहीं देखा है। अन्य सभी शीर्षलेख 'हेडर' फ़ील्ड में हैं।

कोई विचार?

+0

एक के लिए ड्रॉप (res.headers में var k) {console.log (k, res.headers [k]); } शीर्षकों में उपलब्ध सभी कुंजी देखने के लिए। पूंजीकरण की बात हो सकती है। –

+0

धन्यवाद, लेकिन मैंने पहले ही ऑब्जेक्ट पेड़ का निरीक्षण किया है और सामग्री-लंबाई शीर्षलेख से बाहर सबकुछ देखता हूं। – mike

+0

@CharlieKey [प्रतिक्रिया ऑब्जेक्ट में सभी हेडर फ़ील्ड्स के नाम लोअरकेस हैं, इससे कोई फर्क नहीं पड़ता कि वास्तव में उनके पास क्या मामला है।] (Https://nodejs.org/api/http.html#http_message_headers) –

उत्तर

7

www.google.com Content-Length नहीं भेजता है। यह chunked encoding का उपयोग करता है, जिसे आप Transfer-Encoding: chunked शीर्षलेख द्वारा बता सकते हैं।

यदि आप प्रतिक्रिया शरीर का आकार चाहते हैं, तो res की data घटनाओं को सुनें, और प्राप्त बफर का आकार काउंटर वैरिएबल में जोड़ें। जब end आग लगती है, तो आपके पास अंतिम आकार होता है।

यदि आप बड़े प्रतिक्रियाओं के बारे में चिंतित हैं, तो एक बार आपका काउंटर कितने बार बाइट्स से ऊपर हो जाता है, अनुरोध को निरस्त कर दें।

+0

ओच। मैं प्रतिक्रिया का निरीक्षण करने के लिए फिडलर का उपयोग कर रहा था और महसूस नहीं किया कि फिडलर उस शीर्षलेख को जोड़ रहा था। – mike

+1

@ माइक: हाँ, अगर फिडलर स्ट्रीमिंग मोड में नहीं है, तो यह आंतरिक प्रतिक्रिया को आंतरिक रूप से बफर करेगा और फिर 'सामग्री-लंबाई' ब्राउज़र के लिए हेडर। टूलबार में ** स्ट्रीम ** बटन पर क्लिक करें और फिडलर ऐसा नहीं करेगा। – josh3736

3

प्रत्येक सर्वर content-length शीर्षलेख भेजेगा नहीं।

उदाहरण के लिए:

http.get('http://www.google.com', function(res) { 
    console.log(res.headers['content-length']); // undefined 
}); 

लेकिन तुम इतना अनुरोध:

http.get('http://stackoverflow.com/', function(res) { 
    console.log(res.headers['content-length']); // 1192916 
}); 

आप सही ढंग से प्रतिक्रिया से कि हैडर खींच रहे हैं, गूगल सिर्फ अपने मुखपृष्ठ पर यह नहीं भेजता है (वे का उपयोग इसके बजाय खंडित एन्कोडिंग)।

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