1

生成されたプロセスから出力を収集するバックエンド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」イベントでキャプチャされた出力でページを更新したいと思います。ロガーステートメント内で、最初は応答配列の長さが0であることがわかりますが、これは正しいですが、その後、有効なデータを取得してビューにレンダリングしますが、ページは最新のデータで更新されません。ページは1回だけ読み込まれ、ページはそれ以上更新されませんか?

4

1 に答える 1

1

したがって、これを機能させるには別のデザインが必要になります。socket.ioのようなものは、サーバーからブラウザーへのデータのストリーミングに役立ちますが、次のように実行する必要があります。

  1. socket.ioを処理するために空のデータとjavascriptを含む基本的なHTMLページをレンダリングします
  2. ブラウザのjavascriptから、socket.io接続を確立し、データストリームをリクエストします
  3. 使用しているものと同様のコードを使用して、サーバーサブプロセスの出力dataイベントをsocket.ioメッセージに変換します。これは、単一のデータユニットが利用可能であるためです。
  4. ブラウザで、データの各ユニットがサーバーから到着したら、それをHTMLにフォーマットして、テーブルに追加します。
于 2012-12-24T18:19:10.063 に答える