2012-05-19 69 views
1

在使用模板引擎進行驗證時是否存在最佳案例練習?在JavaScript中驗證模板變量

我目前正在用node.js和couchdb構建一個站點,並且我使用express和ejs分別作爲框架和模板引擎。有可能我最終得到了[Object object],或者我的HTML中沒有定義明確的拼寫。我可以嘗試在couch中使用validate_doc_update函數進行驗證,或者在渲染到模板之前,或者在我的路由函數中的節點中,或者在ejs模板中進行驗證。我應該做哪些這些或所有這些?

回答

1

我建議編寫一個函數來獲取您的模板上下文對象併爲渲染做好準備。這些有時稱爲演示者功能和/或演示者模式。在渲染模板之前,您可以使用您的node.js路由功能。該函數可以用空字符串替換空/未定義的字符串,還可以檢測toString爲「[Object object]」或其他不需要的對象,並將它們替換爲空字符串。爲此編寫單元測試很容易,並且會阻止您在許多模板中重複邏輯。該函數應遞歸地遍歷整個對象圖或對象圖的數組。

您可能還需要其他功能,如縮短異常長的字符串。例如,如果有人不小心將一堆垃圾粘貼到用戶對象的「firstName」字段中,並且這超過了一些理智的限制(比如100個字符),則演示者函數可以截斷它並附加省略號。這是數據清理或「演示」類型邏輯的另一個例子。

否則,您需要在您的ejs模板中使用像<%= someObj.someProp || '' %>這樣的表達式,這會導致大量樣板代碼重複。

Here's a first-cut working jsfiddle implementation(使用underscore.js)。

function sanitize(context) { 
    if (Array.isArray(context)) { 
     return _.map(context, sanitize); 
    } 
    _.each(context, function (value, key) { 
     if (value === null) { 
      context[key] = ""; 
      return; 
     } 

     switch (typeof value) { 
      case "object": 
      context[key] = sanitize(value); 
      break; 
      case "number": 
      //No-op 
      break; 
      case "boolean": 
      //No-op 
      break; 
      default: 
      context[key] = value || ""; //handles undefined 
     }     
    }); 
    return context; 
} 
+0

謝謝!好的解決方案嗯..我敢打賭,可以編寫一個可用於我所有模板的演示者函數。你可以發表一個例子嗎?我無法思考如何遞歸遍歷整個對象圖。 array.forEach(function(){if(typeof this ==='array'||'object'){this.forEach})類似的東西嗎? – Costa

+0

你搖滾!非常感謝。 – Costa