2012-03-17 25 views
6

के साथ स्ट्रीमिंग एचटीपी प्रतिक्रियाएं मैं एक साधारण नोडजेएस HTTP सर्वर से विभिन्न प्रतिक्रियाओं के साथ प्रयोग कर रहा हूं। जिस प्रभाव को मैं प्राप्त करने का प्रयास कर रहा हूं वह एक वेब पेज का तेज़ दृश्य प्रतिपादन है। चूंकि प्रतिक्रिया transfer-encoding: chunked (दाएं?) के साथ ब्राउज़र पर स्ट्रीम की जाती है, इसलिए मैं सोच रहा था कि मैं पृष्ठ लेआउट पहले और देरी के बाद शेष डेटा प्रस्तुत कर सकता हूं।नोडजेएस

var http = require('http'); 

http.createServer(function (req, res) { 
    res.writeHead(200, { 
     'Content-Type': 'text/html' 
     , 'Transfer-Encoding': 'chunked' 
    }); 
    res.write('<html>\n'); 
    res.write('<body>\n'); 
    res.write('hello '); 
    res.write('</body>\n'); 
    res.write('</html>\n'); 
    setTimeout(function() { 
     res.end('world'); 
    },1500); 
}).listen(3000, '127.0.0.1'); 

बात यह है कि यह के रूप में यदि प्रतिक्रिया res.end('world') जब तक नहीं भेजा जाता है जब तक कि पहले से ही लिखा डेटा काफी लंबे समय है लगता है, ताकि res.write('hello') के बजाय उदाहरण res.write(new Array(2000).join('1')) के लिए, चाल करना होगा है।

क्या नोड मेरे लेखन को तब तक बफर कर रहा है जब तक डेटा भेजने के लिए पर्याप्त नहीं है? यदि ऐसा है, तो खंड आकार कॉन्फ़िगर करने योग्य है?

उत्तर

3

यह संभव है कि ब्राउज़र डेटा को तब तक प्रस्तुत नहीं कर रहा है जब तक कि बंद टैग पढ़ा नहीं जाता है। इसका परीक्षण करने के लिए एचटीएमएल टैग के बजाय सादे पाठ को आउटपुट करने का प्रयास करें।

क्या आप फायरबग/क्रोम इंस्पेक्टर में आने वाले किसी भी इनपुट को देखते हैं?

Related Question

http://nodejs.org/api/stream.html#stream_stream_write_string_encoding_fd:

धारा को दिया एन्कोडिंग के साथ स्ट्रिंग लिखता है। स्ट्रिंग को कर्नेल बफर पर फ़्लश कर दिया गया है तो सत्य वापस आता है। पर झूठ लौटाता है इंगित करता है कि कर्नेल बफर भर गया है, और डेटा भविष्य में भेजा जाएगा।

तो .write() विधियों के परिणाम आउटपुट करें। देखें कि यह सच या गलत है या नहीं।

+0

.write() का आउटपुट दोनों बार 'सत्य' है। आपके द्वारा लिंक किए गए संबंधित प्रश्न से पता चलता है कि यह मंच विशिष्ट है, इसका कोई मतलब क्या है इसका मतलब है? क्रोम इंस्पेक्टर केवल दोनों मामलों के लिए पूर्ण प्रतिक्रिया समय आउटपुट करता है। समापन टैग पढ़ने से पहले डेटा भी प्रस्तुत किया जाता है, केवल सादा पाठ का उपयोग करते समय यह वही व्यवहार होता है। – Daniel

+1

यह ब्राउज़र विशिष्ट है। इसे विभिन्न ब्राउज़रों में आज़माएं। इसके अलावा, क्रोम इंस्पेक्टर के नेटवर्क टैब में, यदि आप पेज को फिर से लोड करते हैं और नेटवर्क टैब के नीचे पहले आइटम पर क्लिक करते हैं तो आपको डेटा लाइव में देखने में सक्षम होना चाहिए। सुनिश्चित करें कि आप दाहिने पैनल पर पूर्वावलोकन टैब का चयन करें - यहां मैं इसके बारे में बात कर रहा हूं: http://imgur.com/8CJD1 – Straseus

+0

हां, यह निश्चित रूप से ऐसा लगता है कि यह ब्राउज़र है जो प्रतिक्रिया को बफर करता है। मैंने कर्ल के साथ अनुरोध चलाने की कोशिश की और उसने अपेक्षित व्यवहार का उत्पादन किया, (यद्यपि प्रतिक्रिया में लाइन-एंडिंग की कमी होने पर कर्ल बफर लग रहा था \ n') – Daniel