节点Js与response.write的问题

时间:2011-05-20 07:31:54

标签: node.js stream http-1.1

当我尝试利用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/');

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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

来自node.js docs:

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

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

(好的端口使用BTW :))

答案 2 :(得分:2)

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

答案 3 :(得分:0)

修复缺失的大括号后,您的代码正在从浏览器中为我工作。来自命令行的卷曲似乎等待完整的响应,但wireshark确认它确实使用了分块编码,并且在两种情况下都将响应拆分为2个包。

我假设curl输出是行缓冲的,并在打印之前等待'World'之后的换行符。您可以在'hello:'之后打印另一个换行符来确认这一点。

答案 4 :(得分:0)

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

相关问题