3

アプリケーションエラーログをjsonドキュメントとして保存するためにmongodbを使用しています。プレーンな json をブラウザーに返すのではなく、エラー ログを HTML としてフォーマットできるようにしたいと考えています。ログは適切にスキーマレスです-いつでも変更される可能性があるため、これを実行しようとしても意味がありません (ジェイドで):

    - var items = jsonResults

    - each item in items
        h3 Server alias: #{item.ServerAlias}
        p UUID: #{item.UUID}
        p Stack trace: #{item.StackTrace}
            h3 Session: #{item.Session}
            p URL token: #{item.Session.UrlToken}
            p Session messages: #{item.Session.SessionMessages}

JSON構造に実際に何が入るかは事前にわかりません。でも、私が望むことは確かに可能ですか?私が読んでいるものはすべて、スキーマはデータベースによって強制されていないが、とにかくビューコードがスキーマの概要を説明していると言っています-しかし、いつでも削除または追加できる可能性のあるフィールドが何百もあるので、ビューを管理しますこの方法はかなり扱いにくいです。

私は何が欠けていますか?テクノロジーについて間違った仮定をしていますか? これは間違った方法で行っていますか?


コメントに続く追加情報で編集:

jsonドキュメントは次のようになります

{
   "ServerAlias":"GBIZ-WEB",
   "Session":{
      "urltoken":"CFID=10989&CFTOKEN=f07fe950-53926E3B-F33A-093D-3FCEFB&jsessionid=84303d29a229d1",
      "captcha":{

      },
      "sessionmessages":{

      },
      "sessionid":"84197a667053f63433672873j377e7d379101"
   },
   "UUID":"53934LBB-DB8F-79T6-C03937JD84HB864A338",
   "Template":"\/home\/vagrant\/dev\/websites\/g-bis\/code\/webroot\/page\/home\/home.cfm, line 3",
   "Error":{
      "GeneratedContent":"",
      "Mailto":"",
      "RootCause":{
         "Message":"Unknown tag: cfincflude.",
         "tagName":"cfincflude",
         "TagContext":[
            {
               "RAW_TRACE":"\tat cfhome2ecfm1296628853.runPage(\/home\/vagrant\/dev\/websites\/nig-bis\/code\/webroot\/page\/home\/home.cfm:3)",
               "ID":"CFINCLUDE",
               "TEMPLATE":"\/home\/vagrant\/dev\/websites\/nig-bis\/code\/webroot\/page\/home\/home.cfm",
               "LINE":3,
               "TYPE":"CFML",
               "COLUMN":0
            },
            {
               "RAW_TRACE":"\tat cfdisplay2ecfm1093821753.runPage(\/home\/vagrant\/dev\/websites\/nig-bis\/code\/webroot\/page\/display.cfm:6)",
               "ID":"CFINCLUDE",
               "TEMPLATE":"\/home\/vagrant\/dev\/websites\/nig-bis\/code\/webroot\/page\/display.cfm",
               "LINE":6,
               "TYPE":"CFML",
               "COLUMN":0
            }
         ]
       }
   }

...などですが、ログを生成する個々のプロジェクトが何をトリガーするように構成されているかによって変わる可能性があります。

私が最終的に作成したいのは、データ構造を反復処理する、各親と以下にリストされている子のヘッダーを備えたフォーマット済みの HTML ページです。上記の Jade のサンプルは、事実上、出力する必要があるものですが、ビューにハードコーディングする必要はありません。

問題のコメントでのマイクの分析は、実際にはあまり共通点のない一連のコレクションからテーブルのような構造を作成することであるということです。データはリレーショナルですが、個々のドキュメント内のみです。そのため、データ構造がどのように見えるかを最初に知る必要があるため、スキーマを何かにハードコーディングすることは事実上不可能です。

4

3 に答える 3

2

基本的な考え方は@Gates VPが説明したものです。配列/オブジェクトを反復処理するためにunderscore.jsを使用します。

function formatLog(obj){
  var log = "";
  _.each(obj, function(val, key){ 
    if(typeof(val) === "object" || typeof(val) === "array"){
      // if we have a new list
      log += "<ul>";
      log += formatLog(val);
      log += "</ul>";
    }
    else{
      // if we are at an endpoint
      log += "<li>";
      log += (key + ": " + val);
      log += "</li>";
    }
  });
  return log;
}

formatLog()与えたサンプルデータを呼び出すと、返されます

  • サーバーエイリアス: GBIZ-WEB
    • URLトークン: CFID=10989&CFTOKEN=f07fe950-53926E3B-F33A-093D-3FCEFB&jsessionid=84303d29a229d1
        • セッション ID: 84197a667053f63433672873j377e7d379101
      • UUID: 53934LBB-DB8F-79T6-C03937JD84HB864A338
      • テンプレート: /home/vagrant/dev/websites/g-bis/code/webroot/page/home/home.cfm、3 行目
        • 生成されたコンテンツ:
        • メールアドレス:
          • メッセージ: 不明なタグ: cfincflude。
          • タグ名: cfincflude
              • RAW_TRACE: cfhome2ecfm1296628853.runPage (/home/vagrant/dev/websites/nig-bis/code/webroot/page/home/home.cfm:3) で
              • ID: CFINCLUDE
              • テンプレート: /home/vagrant/dev/websites/nig-bis/code/webroot/page/home/home.cfm
              • ライン: 3
              • タイプ: CFML
              • 列: 0
              • RAW_TRACE: cfdisplay2ecfm1093821753.runPage (/home/vagrant/dev/websites/nig-bis/code/webroot/page/display.cfm:6) で
              • ID: CFINCLUDE
              • テンプレート: /home/vagrant/dev/websites/nig-bis/code/webroot/page/display.cfm
              • ライン: 6
              • タイプ: CFML
              • 列: 0

      それをどのようにフォーマットするかはあなた次第です。

      于 2012-07-20T00:17:40.960 に答える
      1

      これは基本的に再帰forループです。

      Jade でこれを行うには、ミックスインを使用して、より深いレベルのインデントで mixin を呼び出してネストされたオブジェクトを出力できるようにする必要があります。

      フィールドの順序が保証されず、配列のループと JSON オブジェクトのループを区別するロジックを実装する必要がある場合があるため、この全体が少し見苦しいことに注意してください。

      于 2012-07-19T17:38:23.790 に答える
      0

      util.inspect を試すことができます。あなたのテンプレートで:

      pre
        = util.inspect(jsonResults)
      
      于 2012-07-19T13:07:15.433 に答える