节点Express内容长度

我使用node.js并在一个小的项目中expression。 我设置响应头像打击:

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

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

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

连接:保持活跃
内容编码:gzip
内容types:文本/无格式;字符集= utf-8的
date:2013年6月1日星期六08:21:59 GMT
传输编码:分块
有所不同:接受编码
X-已启动方式:快递

那么,为什么内容消失?

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

Node.js默认为Transfer-Encoding: chunked 。 但是,通过在本机http响应对象上设置Content-Length标头,将禁用此function。 HTTP模块的文档说:

发送“内容长度”标题将禁用默认分块编码。

Content-Encoding:gzip标题中,您可能已经启用了connect.compress中间件。 connect.compress中间件删除了Content-Length头。

无论如何,除非您自己生成gzip内容,否则您自己生成的Content-Length标题对于最终(gzip)响应主体肯定是不适当的。 幸运的是,连接中间件为你照顾。

当使用Express或Connect时,您不应该认为用res对象“发送”的东西实际上是以这种方式发送给客户端的。 中间有中间件。 所有中间件都能够改变响应的任何内容,包括更改响应主体,添加,删除和更改标题。 请求也一样。

另请参阅以下问题:

  • 分块编码和内容长度标题
  • HTTP分块数据大小和内容长度