我使用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
那么,为什么 内容长度 消失了?
答案 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对象“发送”的内容实际上以这种方式发送到客户端。介于两者之间的中间件。所有中间件都能够更改响应的任何内容,包括更改响应主体,添加,删除和更改标头。同样适用于请求。
另见这些问题: