2012-07-19 46 views
3

我正在使用mongodb將應用程序錯誤日誌存儲爲json文檔。我希望能夠將錯誤日誌格式化爲HTML,而不是將普通的json返回給瀏覽器。日誌是正確的無模式 - 他們可以在任何時候改變,因此也沒有用試圖做到這一點(翡翠):如何使用node.js/mongodb在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示例實際上是我們需要輸出的內容,但沒有在視圖中對其進行硬編碼。

邁克在這個問題的評論中的分析是從一堆沒有真正共同點的集合中創建一個表格式的結構,這種分析是激動人心的。數據是關係型的,但只在單個文檔中 - 將模式編碼成任何東西實際上是不可能的,因爲它要求您知道數據結構首先是什麼樣的。

+0

你能張貼您的日誌看起來像什麼,改變的版本會是什麼樣子的例子嗎? – dignifiedquire 2012-07-19 11:49:44

+0

難道是你正在試圖從可能對每個文檔不同的屬性集合創建一個類似結構的表一個安全的假設?我也投入了大量的思想,並且還提出了我真正喜歡的解決方案。如果我的假設是正確的,你可能想把它添加到你的問題。這將使其更易讀一點:)順便說一下+1 – Mike 2012-07-19 12:49:03

+0

大問題 - 額外的好處是,我沒有聽說過underscore.js之前現在它也是非常有用的。謝謝! – Mike 2012-07-19 12:49:55

回答

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()你給它返回

  • ServerAlias:GBIZ-WEB
    • URLTOKEN: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行
        • GeneratedContent:
        • 郵寄地址:
          • 消息:未知標籤: cfincflude。
          • 的tagName: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
              • LINE:3
              • TYPE:CFML
              • 柱:0
              • RAW_TRACE:在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
              • 柱:0

      如何格式化則取決於您。

      +0

      這是令人驚訝的有益 – hollsk 2012-07-21 16:53:45

      0

      您可以嘗試util.inspect。在您的模板中:

      pre 
          = util.inspect(jsonResults) 
      
      1

      這基本上是一個遞歸for循環。

      要用Jade做到這一點,您需要使用mixins,以便通過調用具有更深層次縮進級別的mixin來打印嵌套對象。

      請注意,這整個事情有點醜,因爲你不會得到保證的字段順序,你可能不得不實現一些邏輯來區分循環數組和循環JSON對象。

      相關問題