7

出色地,

我对 node.js 完全陌生。开始尝试它,我正在关注 Ryan Dahl ( http://www.youtube.com/watch?v=jo_B4LTHi3I ) 的介绍,此时(大约 0:17:00)有一个关于如何服务器的解释处理响应,

基本示例是从网络服务器获得“hello”输出,然后在 2 秒后出现“世界”,这段代码应该这样做

//Require the webserver library 
var http = require('http');

var server = http.createServer(function(req, res) {
    res.writeHead(200, { 'content-type' : 'text-plain' });
    res.write('Hello\n');

    //Asynchronous behavior
    setTimeout(function() {
        res.end('World\n');
    }, 2000);
});

server.listen(3000);

所以我运行它,我得到了 Hello World,但只有一个来自服务器的完整结果响应,即 request > 2 sec > 'Hello World'。而不是请求 > Hello > 2 secs > World。

为什么会这样?,我该如何改变这种行为?

我正在使用 v0.8.18, curl -ihttp://localhost:3000返回正确的标题... HTTP/1.1 200 OK content-type: text-plain Date: Sat, 26 Jan 2013 18:10:05 GMT Connection: keep-alive Transfer-Encoding: chunked

4

3 回答 3

6

在开始渲染之前,浏览器会缓冲传入的数据,直到收到一定数量的数据。您的 Node 代码会按照您的预期执行,它将发送响应的第一部分,然后等待 2 秒,然后发送后半部分。

如果你想观察这种行为,你可以发送一堆空格让浏览器清空它的缓冲区。如果您在初始写入后添加它,您将看到浏览器呈现请求的前半部分。

var str = '';
for (var i = 0; i < 2000; i++){
  str += ' ';
}
res.write(str);

显然不要在实际代码中这样做,但最好演示一下行为。

于 2013-01-26T19:15:27.180 回答
1

使用 curl,您的代码将按预期执行。浏览器等待整个正文,但 curl 打印“hello”,等待 2 秒然后打印“worls”。我复制了你的确切代码,没关系。

于 2013-01-26T19:12:12.520 回答
0

您可以使用内容类型 text/html 更改行为

res.writeHead(200, { 'content-type' : 'text/html' });

浏览器将对不同的内容类型采取不同的行动。也使用 content-type text-html 将使 curl 保持缓冲区并且仅在缓冲区完成后打印

我只是在实验中测试这个,但我仍然不知道为什么在浏览器和 curl 上这样做

于 2020-11-22T23:43:13.297 回答