NodeJS代码在通过浏览器运行时以及在终端中通过curl运行时执行的方式不同

时间:2014-02-19 12:28:13

标签: node.js

我有以下简单的NodeJS代码:

var http = require("http");

http.createServer( function(request, response){
    response.writeHead(200);
    setTimeout(function(){
        response.write("This printed 3 secs later, ait?");
        response.end();
    }, 3000);

    response.write("This will be printed before.\n");
}).listen(8080);

如果我使用node scriptname.js运行脚本,然后通过终端中的curl访问它,如下所示:

curl http://localhost:8080

我按预期获得输出,首先打印This will be printed before.,然后在3秒后输出This printed 3 secs later, ait?

但是,当我在浏览器中打开http://localhost:8080(最新版本的Chrome,Firefox)页面加载3秒钟时,它会同时打印文本This will be printed before. This printed 3 secs later, ait?。为什么会发生这种情况,我怎么能在浏览器中做出相同的行为呢?

编辑:正如Ken在回答中所述

  

...这仅仅是由于浏览器呈现引擎呈现内容的行为。渲染引擎将内容兑换为response.end();

并建议去看看Socket.IO,我想出了这个使用expressSocket.IO的工作示例:

// timeoutTest.js

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server);

server.listen(8080);

app.use(express.static(__dirname + '/'));

app.get('/', function (req, res) {
   res.sendfile(__dirname + '/timeoutTest.html');
});

io.sockets.on('connection', function (client) {
   client.emit('msg', "This prints right now on connection.");

   setTimeout(function(){
      client.emit('msg', "This prints out after 3 secs.");      
   }, 3000);
});

// timeoutTest.html

<!DOCTYPE html>
<html>
<head>
    <script src="/socket.io/socket.io.js"></script>
    <script src="jquery.js"></script>
    <script>
    $(document).ready(function(){
        var server = io.connect('http://localhost');
        server.on('msg', function(data){
            $('body').append(data + "<br/>");
        });
    });
    </script>
</head>
<body>
</body>
</html>

1 个答案:

答案 0 :(得分:3)

我认为这仅仅是由于浏览器呈现引擎呈现内容的行为。

渲染引擎将内容兑换为内容 response.end();到达,然后呈现整体。

基本上,浏览器中的HTML内容永远不会通过增量server push自动更新,例如response.write

您必须通过Ajax和DHTML / js技术将pull数据从服务器发送到浏览器客户端。

就节点服务器的单纯输出而言,

终端中的curl是完全不同的故事。

如果您在node服务器和浏览器客户端之间寻求更多互动行为,如果您需要server push功能,websocket是可行的方法,还可以调查node stream内容

Socket.IO很有名,node stream https://github.com/substack/stream-handbook对你来说应该很有趣。

我个人在我自己的项目中这样做:

http://kenokabe.github.io/MarkdownLive/

我使用Markdown写东西,需要一个流预览,所以我自己创建。预览屏幕是一个浏览器HTML页面,HTML内容以流方式递增地呈现和更新。