NodeJS Express - 自动呈现页面更新

时间:2012-12-24 12:50:38

标签: node.js express ejs

我有一个后端NodeJS代码,我在其中收集来自生成过程的输出:

    schild.stdout.on('data', function (data) {
    var result = data.toString().split("\n");
    for(var i = 0; i < result.length; i++)
    {
            var n = result[i].split("|");
            if(n.length == 4)
            {
                    var date = n[0];
                    var category = n[1];
                    var component = n[2];
                    var condition = n[3];
                    response.push({Date : date, Category : category, Component : component, Condition : condition});
            }
    }
    logger.info('Rendering : ' + response.length);
    res.render('viewpage', {status:0, msg:'Success', responsedata:response});

});

我的viewpage.ejs文件包含以下代码:

var oTable = $('#example').dataTable({"bDestroy" : true, "bUseRendered": false, "bSort" : false, "bPaginate" : true, "bDeferRender": true, "iDisplayLength" : 27});
var status = <%= status %>;
if(status == 2)
{
alert( '<%= msg %>' );
}
if(status == 0)
{
<% for(var i =0; i < responsedata.length; i++){ %>
        $('#example').dataTable().fnAddData(['<%= responsedata[i].Date %>', '<%= responsedata[i].Category %>' , '<%= responsedata[i].Component %>', '<%= responsedata[i].Condition %>']);
<% } %>
        oTable.fnDraw();
}
        } );

问题是该页面仅在第一次调用'res.render'时呈现,但我希望使用'schild.stdout.on'事件中捕获的更多输出更新页面。我确实在我的logger语句中看到第一次响应数组的长度是0,这是正确的,但随后我得到有效的数据并呈现给视图 - 但页面没有得到最新数据的更新。页面只加载一次,页面上没有进一步的更新?

1 个答案:

答案 0 :(得分:1)

所以你需要一个不同的设计来完成这项工作。类似socket.io之类的东西可以帮助将数据从服务器传输到浏览器,但是您需要按照以下方式进行操作:

  1. 使用空数据和javascript渲染基本HTML页面以处理socket.io
  2. 从浏览器中的javascript,建立socket.io连接并请求您的数据流
  3. 使用类似于您所拥有的代码,将服务器子进程的输出data事件转换为socket.io消息,因为单个数据单元是可用的
  4. 在浏览器中,当每个数据单元从服务器到达时,将其格式化为HTML并将其附加到您的表中。