节点快速内容长度

时间:2013-06-01 08:51:07

标签: node.js express content-length

我使用node.js并在一个小项目中表达。我设置响应标题就像打击:

res.set({'Content-Type':'text/plain;charset=utf-8',    
'Content-Length': Buffer.byteLength(data, 'utf-8')});       

我可以使用console.log打印数据的长度是317.

但是在浏览器的控制台上,我只是得到了这些:

  

连接:保活
  内容编码:gzip
  内容类型:文本/无格式;字符集= UTF-8
  日期:星期六,2013年6月1日08:21:59 GMT
  传输编码:分块
  有所不同:接受编码
  X-Powered-By:Express

那么,为什么 内容长度 消失了?

1 个答案:

答案 0 :(得分:35)

回复有Transfer-Encoding: chunked。这里Content-Length不适用,因为内容是在响应主体内的一个或多个部分(块)中发送的,其中标记指示每个单独块的字节长度。 http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Node.js默认为Transfer-Encoding: chunked。但是,通过在本机http响应对象上设置Content-Length标头来禁用此功能。 Documentation of HTTP module说:

  

发送'Content-length'标头将禁用默认的分块编码。

通过响应中的Content-Encoding:gzip标头,您可能启用了connect.compress中间件。 connect.compress中间件会删除Content-Length标头。

在任何情况下,除非您自己生成gzip压缩内容,否则您自己生成的Content-Length标题肯定不适合最终(gzipped)响应正文。幸运的是,连接中间件可以为您解决这个问题。

使用Express或Connect时,您不应该假设您使用res对象“发送”的内容实际上以这种方式发送到客户端。介于两者之间的中间件。所有中间件都能够更改响应的任何内容,包括更改响应主体,添加,删除和更改标头。同样适用于请求。

另见这些问题: