如何在输出前禁用res.writeHead()输出额外的数字?

我用express创build一个http服务器。 以下是服务器代码:

router.get('/', function(req, res, next) { // req.socket.setTimeout(Infinity); res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8', // <- Important headers 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', }); res.write('hell'); res.write('world'); res.end(); // res.write('\n\n'); // response = res; }); 

当我使用netcat来获取url。 输出是这样的

 GET /sse HTTP/1.1 HTTP/1.1 200 OK X-Powered-By: Express Content-Type: text/plain; charset=utf-8 Cache-Control: no-cache Expires: 0 Connection: keep-alive Keep-Alive: timeout=5, max=97 Date: Fri, 30 Jun 2017 11:50:00 GMT Transfer-Encoding: chunked 4 hell 5 world 0 

我的问题是为什么在每个res.write()之前总是有一个数字? 而数字似乎是res.write输出的长度。

我如何删除号码?

这是分块编码的工作原理。 你不必首先声明你要发送多less字节,而是每个块都有它所拥有的字节数。 例如:4代表"hell" ,5代表"world" ,最后0代表“没有更多的字节发送”。

你可以看到你有分块的编docker:

 Transfer-Encoding: chunked 

现在,直接回答你的问题,删除你不得不closures分块编码的数字。 要做到这一点,你必须将Content-length头部设置为要在响应主体中发送的字节数。

例如:

 app.get('/', function(req, res, next) { res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Content-length': 9, // <<<--- NOTE HERE }); res.write('hell'); res.write('world'); res.end(); }); 

(当然,在实际的代码中,您必须计算响应的长度,或者在设置Content-length头之前build立一个string或缓冲区并获取其长度。)

但是请注意,如果您使用curl或任何其他HTTP客户端,那么它将为您“删除”数字。 这只是与netcat你意外地看到了分块编码的底层实现细节,但所有的真正的HTTP客户端可以处理,就好了。

通常在HTTP中,你可以在头文件中声明整个响应的长度,然后把这个正文一个一个地发送给多个块,但是它必须和你声明的长度相同。 这意味着在知道要发送的所有内容的长度之前,您无法开始发送数据。 使用分块编码就足以宣告您发送的每个块的长度,但是您不必知道整个响应的长度 – 甚至可以是无限的,这取决于您。 它可以让你开始发送,只要你有任何发送,这是非常有用的。