8

当我出于某种原因尝试使用 http 流连接时,写入不会刷新,直到我调用 response.end()
我直接从演示中获取代码并且不明白我的问题是什么。
当我卷曲到服务器时,我的标题是正确的。

HTTP/1.1 200 OK
Content-Type: text/plain
Connection: keep-alive
Transfer-Encoding: chunked


var http = require('http');
    http.createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.write('hello');
      res.write(':');
      setTimeout(function(){ 
          res.end('World\n')},
          2000);
    }).listen(1337, "127.0.0.1");
    console.log('Server running at http://127.0.0.1:1337/');

为什么服务器不发送写入数据?

4

5 回答 5

5

我似乎是浏览器特定的行为——firefox 立即显示数据(“Hello:”),而 chrome 似乎缓冲并等待响应结束。请注意,如果您首先写入更多数据,chrome 也会立即显示数据(例如,我写了 1000 个“Hello”)。

于 2011-05-20T11:13:09.180 回答
3

我想我明白你的意思了...

从 node.js 文档:

第一次调用 response.write() 时,它会将缓冲的 header 信息和第一个 body 发送给客户端。第二次调用 response.write() 时,Node 假定您将要流式传输数据,并单独发送。也就是说,响应被缓冲到正文的第一块。

http://nodejs.org/docs/v0.4.7/api/all.html#response.write

(顺便说一句,端口使用不错:))

于 2011-05-20T07:39:58.987 回答
2

尝试使用 telnet 或 nc 检查您的代码。curl 通常缓冲最后一行

于 2011-05-20T11:53:34.943 回答
0

修复丢失的花括号后,您的代码在浏览器中为我工作。命令行中的 Curl 似乎在等待完整的响应,但 wireshark 确认它确实使用了分块编码,并且在两种情况下响应都被分成 2 个包。

我假设 curl 输出是行缓冲的,并在打印任何内容之前等待“世界”之后的换行符。您可以通过在 'hello:' 之后打印另一个换行符来确认这一点。

于 2011-05-20T09:47:28.243 回答
0

这是因为您在代码中res.end('World\n')逗号前后的位置错过了一个封闭的“}”。

于 2013-03-20T08:39:31.887 回答