2012-03-17 176 views
6

我正在試驗來自簡單NodeJS HTTP服務器的各種響應。 我試圖實現的效果是更快的網頁視覺渲染。由於響應是通過transfer-encoding: chunked(右?)流式傳輸到瀏覽器的,我想我可以首先渲染頁面佈局,並在延遲後渲染其餘數據。使用NodeJS流式傳輸Http響應

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(new Array(2000).join('1'))的而不是res.write('hello'),會做的伎倆。

節點是否正在緩存我的寫入,直到數據足夠大才能發送?如果是這種情況,塊大小是否可配置?

回答

3

瀏覽器在讀取結束標記之前可能不會呈現數據。嘗試輸出純文本而不是html標籤來測試。

你看到任何輸入到螢火蟲/鉻檢查器?

Related Question

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

寫入字符串與給定的編碼流中。如果 字符串已刷新到內核緩衝區,則返回true。返回false到 表示內核緩衝區已滿,將來將發送數據到 。

因此輸出.write()方法的結果。看看它是否返回true或false。

+0

.write()的輸出兩次都是「真」。您鏈接的相關問題表明,這是平臺特定的,關於這將意味着什麼? 鉻檢查器只輸出完成的響應時間,兩種情況都一樣。 數據也在結束標記讀取之前呈現,這與使用純文本時的行爲相同。 – Daniel 2012-03-17 19:29:33

+1

它是瀏覽器特定的。在不同的瀏覽器中試用它。此外,在Chrome檢查器的網絡選項卡中,如果重新加載頁面並單擊網絡選項卡下的第一項,則應該可以看到數據實時顯示。請確保您選擇了右側面板上的預覽選項卡 - 以下是我正在討論的內容:http://imgur.com/8CJD1 – Straseus 2012-03-18 05:26:37

+0

是的,它確定似乎是緩衝響應的瀏覽器。我試着用curl來運行請求,並且產生了預期的行爲,(儘管如果響應缺少行結束符,curl似乎會緩衝)\ n \ n – Daniel 2012-03-18 09:43:50