2012-03-17 44 views
6

Tôi đang thử nghiệm các phản hồi khác nhau từ một máy chủ HTTP NodeJS đơn giản. Hiệu ứng tôi đang cố gắng đạt được là hiển thị trực quan nhanh hơn của trang web. Vì phản hồi được truyền tới trình duyệt với transfer-encoding: chunked (phải không?) Tôi đã nghĩ tôi có thể hiển thị bố cục trang đầu tiên và phần còn lại của dữ liệu sau khi trì hoãn.Phản hồi luồng trực tuyến với NodeJS

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'); 

Cái này là nó có vẻ như thể phản ứng không được gửi đến res.end('world') trừ khi dữ liệu đã được viết là đủ dài, do đó ví dụ res.write(new Array(2000).join('1')) thay vì res.write('hello') đó, sẽ làm các trick.

Node có lưu vào bộ đệm của tôi cho đến khi dữ liệu đủ lớn để gửi không? Nếu đúng như vậy, kích thước đoạn có thể cấu hình được không?

Trả lời

3

Có thể trình duyệt không hiển thị dữ liệu cho đến khi các thẻ đóng đã được đọc. Hãy thử xuất văn bản thuần thay vì thẻ html để kiểm tra điều này.

Bạn có thấy bất kỳ đầu vào nào vào thanh tra firebug/chrome không?

Related Question

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

Viết chuỗi với mã hóa trao cho các dòng. Trả về true nếu chuỗi đã được chuyển sang bộ đệm hạt nhân. Trả về false là cho biết bộ đệm hạt nhân đã đầy và dữ liệu sẽ được gửi đi trong tương lai.

Vì vậy, xuất kết quả của .write() phương pháp. Xem nếu nó trả về đúng hay sai.

+0

Đầu ra của .write() là 'true' cả hai lần. Đó là câu hỏi liên quan bạn liên kết cho thấy rằng đây là nền tảng cụ thể, bất kỳ ý tưởng về những gì mà có nghĩa là gì? Trình kiểm tra chrome chỉ xuất ra thời gian phản hồi đã hoàn thành, tương tự cho cả hai trường hợp. Dữ liệu cũng được hiển thị trước khi các thẻ đóng đã được đọc, đó là hành vi tương tự khi chỉ sử dụng văn bản thuần túy. – Daniel

+1

Đó là trình duyệt cụ thể. Hãy dùng thử trong các trình duyệt khác nhau. Ngoài ra, trong tab mạng của thanh tra chrome, bạn sẽ có thể thấy dữ liệu xuất hiện trực tiếp nếu bạn tải lại trang và nhấp vào mục đầu tiên trong tab mạng. Hãy chắc chắn rằng bạn chọn tab xem trước trên bảng bên phải - đây là những gì tôi đang nói về: http://imgur.com/8CJD1 – Straseus

+0

Có, nó chắc chắn có vẻ như nó là trình duyệt mà bộ đệm phản ứng. Tôi đã thử chạy các yêu cầu với curl và sản xuất các hành vi mong đợi, (mặc dù curl dường như đệm nếu đáp ứng thiếu kết thúc dòng '\ n') – Daniel

Các vấn đề liên quan