我有以下脚本,似乎节点不包括响应对象中的Content-Length标头。我需要知道消耗数据之前的长度,因为数据可能非常大,我宁愿不缓冲它。
http.get('http://www.google.com', function(res){
console.log(res.headers['content-length']); // DOESN'T EXIST
});
我已经遍布对象树,没有看到任何东西。所有其他标题都在“标题”字段中。
有什么想法吗?
答案 0 :(得分:7)
www.google.com不会发送Content-Length
。它使用chunked encoding,您可以通过Transfer-Encoding: chunked
标题来判断。
如果您想要响应正文的大小,请收听res
的{{1}}个事件,并将收到的缓冲区的大小添加到计数器变量中。当data
触发时,您将拥有最终尺寸。
如果您担心响应较大,请在计数器超过多少字节时中止请求。
答案 1 :(得分:3)
并非每个服务器都会发送content-length
标头。
例如:
http.get('http://www.google.com', function(res) {
console.log(res.headers['content-length']); // undefined
});
但如果你要求SO:
http.get('http://stackoverflow.com/', function(res) {
console.log(res.headers['content-length']); // 1192916
});
你正确地从响应中提取了这个标题,谷歌只是不在他们的主页上发送它(他们使用的是分块编码)。