NodeJS Express – 自动呈现页面更新

我有一个后端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'事件中捕获的更多的输出来更新页面。 我看到在我的logging器语句中,第一次响应数组的长度为0,这是正确的,但随后我得到有效的数据并呈现给视图 – 但是页面没有被最新的数据更新。 该页面只加载一次,页面上没有进一步的更新?

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

  1. 用空数据和javascript呈现基本的HTML页面来处理socket.io
  2. 从浏览器中的javascript,build立一个socket.io连接并请求你的数据stream
  3. 使用类似于您所拥有的代码,将服务器subprocess的输出data事件转换为socket.io消息,作为单个数据单元是可用的
  4. 在浏览器中,每个数据单元从服务器到达,将其格式化为HTML并将其附加到表格中。