2013-08-26 40 views
7

Tôi có tập lệnh sau và có vẻ như nút không bao gồm tiêu đề Nội dung độ dài trong đối tượng phản hồi. Tôi cần phải biết chiều dài trước khi tiêu thụ dữ liệu và vì dữ liệu có thể khá lớn, tôi không muốn đệm nó.Trong node.js, làm cách nào để lấy tiêu đề Nội dung Độ dài theo http.get()?

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

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

Tôi đã điều hướng trên cây đối tượng và không thấy gì cả. Tất cả các tiêu đề khác đều nằm trong trường 'tiêu đề'.

Bất kỳ ý tưởng nào?

+0

Thả một (var k in res.headers) {console.log (k, res.headers [k]); } để xem tất cả các khóa có sẵn trong các tiêu đề. Có thể là một điều viết hoa. –

+0

Cảm ơn, nhưng tôi đã kiểm tra cây đối tượng và xem mọi thứ XÁC NHẬN tiêu đề nội dung có độ dài. – mike

+0

@CharlieKey [Tất cả tên của các trường tiêu đề trong đối tượng phản hồi là chữ thường, bất kể trường hợp nào chúng thực sự có.] (Https://nodejs.org/api/http.html#http_message_headers) –

Trả lời

7

www.google.com không gửi Content-Length. Nó sử dụng chunked encoding, bạn có thể biết bằng tiêu đề Transfer-Encoding: chunked.

Nếu bạn muốn kích thước của nội dung phản hồi, hãy nghe res 's data sự kiện và thêm kích thước của bộ đệm đã nhận vào biến số lượt truy cập. Khi end kích hoạt, bạn có kích thước cuối cùng.

Nếu bạn lo lắng về các phản hồi lớn, hãy hủy yêu cầu khi bộ đếm của bạn vượt quá số byte bao nhiêu.

+0

Ouch. Tôi đã sử dụng fiddler để kiểm tra các phản ứng và không nhận thấy fiddler đã được thêm tiêu đề trong. – mike

+1

@mike: Có, nếu Fiddler không ở chế độ Streaming, nó sẽ đệm toàn bộ phản hồi nội bộ và sau đó gửi một 'Content-Length' tiêu đề cho trình duyệt. Nhấp vào nút ** Luồng ** trên thanh công cụ và Fiddler sẽ không làm điều này. – josh3736

3

Không phải mọi máy chủ đều sẽ gửi các tiêu đề content-length.

Ví dụ:

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

Nhưng nếu quý vị yêu cầu SO:

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

Bạn đang kéo một cách chính xác tiêu đề mà từ phản ứng, google chỉ không gửi nó trên trang chủ của họ (họ sử dụng chunked encoding thay thế).

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