2013-06-01 14 views
15

मैं Node.js का उपयोग करें और एक छोटी परियोजना पर व्यक्त करते हैं। मैं झटका की तरह प्रतिक्रिया हेडर सेट:नोड एक्सप्रेस सामग्री-लंबाई

res.set({'Content-Type':'text/plain;charset=utf-8',  
'Content-Length': Buffer.byteLength(data, 'utf-8')});  

मैं उपयोग कर सकते हैं console.log प्रिंट डेटा की दूरी 317

है लेकिन ब्राउज़र के कंसोल, मैं सिर्फ इन मिलती है:

कनेक्शन: जीवित-रखें
सामग्री-एन्कोडिंग: gzip
सामग्री-प्रकार: टेक्स्ट/सादा; charset = utf-8
दिनांक: शनि, 01 जून 2013 08:21:59 GMT
स्थानांतरण-एन्कोडिंग:
chunked Vary: Accept-एन्कोडिंग
एक्स संचालित-द्वारा: एक्सप्रेस

तो, क्यों सामग्री-लंबाई गायब हो गया?

उत्तर

29

प्रतिक्रिया Transfer-Encoding: chunked है। यहाँ Content-Length सामग्री एक मार्कर प्रत्येक व्यक्ति के हिस्सा के बाइट-लंबाई का संकेत के साथ प्रतिक्रिया शरीर के अंदर एक या अधिक भागों (मात्रा) में भेज दिया जाता है, क्योंकि, लागू नहीं है। http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Node.js Transfer-Encoding: chunked करने के लिए डिफ़ॉल्ट। हालांकि, यह देशी http प्रतिक्रिया ऑब्जेक्ट पर Content-Length शीर्षलेख सेट करके अक्षम है। Documentation of HTTP module कहता है:

'सामग्री-लंबाई' शीर्षलेख भेजना डिफ़ॉल्ट खंडित एन्कोडिंग को अक्षम कर देगा।

अपने जवाब में Content-Encoding:gzip हैडर से जा रहे हैं, तो आप शायद connect.compress मिडलवेयर सक्षम है। connect.compress मिडलवेयर Content-Length हैडर निकाल देता है।

किसी भी मामले में, जब तक कि आप स्वयं को gzipped सामग्री उत्पन्न नहीं कर लेते हैं, Content-Length हेडर जो आप स्वयं उत्पन्न करते हैं, निश्चित रूप से अंतिम (gzipped) प्रतिक्रिया निकाय के लिए अनुचित होगा। सौभाग्य से, कनेक्ट मिडलवेयर आपके लिए इसका ख्याल रखता है।

एक्सप्रेस या कनेक्ट का उपयोग करते समय, आपको यह नहीं मानना ​​चाहिए कि जो चीजें आप रेस ऑब्जेक्ट के साथ "भेजते हैं" वास्तव में क्लाइंट को उस तरह से भेजते हैं। बीच में मिडलवेयर है। सभी मिडलवेयर में प्रतिक्रिया के बारे में कुछ भी बदलने की क्षमता है, जिसमें प्रतिक्रिया निकाय को बदलना और हेडर जोड़ना, हटाना और बदलना शामिल है। अनुरोध के लिए ही चला जाता है।

+0

कृपया टिप्पणी आप क्यों downvote:

भी इन सवालों देखते हैं? –

+2

क्षमा करें, मैं ने इस downvote किया पता नहीं है, लेकिन तुम सही हो। आपका बहुत बहुत धन्यवाद। टिप्पणी के बाद 'app.use (express.compress());', सामग्री-लंबाई प्रकट होती है। लेकिन, क्या मैं gzip और सामग्री-लंबाई दोनों का उपयोग कर सकता हूं? –

+0

@ डीएमडीजीकर, सिद्धांत रूप में, हां, आप 'स्थानांतरण-एन्कोडिंग: gzip' और' सामग्री-लंबाई 'का उपयोग कर सकते हैं।हालांकि, 'express.compress' मिडलवेयर के साथ नहीं। यह सिर्फ इसका समर्थन नहीं करता है। सिद्धांत रूप में, यदि आप प्रतिक्रिया की लंबाई जान सकते हैं तो एक सामग्री-लंबाई शीर्षलेख भेजना पसंद किया जाना चाहिए। आप स्वयं सामग्री को संपीड़ित कर सकते हैं या विभिन्न "संपीड़न" मिडलवेयर की तलाश कर सकते हैं। लेकिन 'सामग्री-लंबाई' को भेजे गए वास्तविक सामग्री को प्रतिबिंबित करना चाहिए। यह अंतिम (शायद संपीड़ित) शरीर की बाइट-लंबाई को प्रतिबिंबित करना चाहिए। –

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