在使用模板引擎進行驗證時是否存在最佳案例練習?在JavaScript中驗證模板變量
我目前正在用node.js和couchdb構建一個站點,並且我使用express和ejs分別作爲框架和模板引擎。有可能我最終得到了[Object object],或者我的HTML中沒有定義明確的拼寫。我可以嘗試在couch中使用validate_doc_update函數進行驗證,或者在渲染到模板之前,或者在我的路由函數中的節點中,或者在ejs模板中進行驗證。我應該做哪些這些或所有這些?
在使用模板引擎進行驗證時是否存在最佳案例練習?在JavaScript中驗證模板變量
我目前正在用node.js和couchdb構建一個站點,並且我使用express和ejs分別作爲框架和模板引擎。有可能我最終得到了[Object object],或者我的HTML中沒有定義明確的拼寫。我可以嘗試在couch中使用validate_doc_update函數進行驗證,或者在渲染到模板之前,或者在我的路由函數中的節點中,或者在ejs模板中進行驗證。我應該做哪些這些或所有這些?
我建議編寫一個函數來獲取您的模板上下文對象併爲渲染做好準備。這些有時稱爲演示者功能和/或演示者模式。在渲染模板之前,您可以使用您的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;
}
謝謝!好的解決方案嗯..我敢打賭,可以編寫一個可用於我所有模板的演示者函數。你可以發表一個例子嗎?我無法思考如何遞歸遍歷整個對象圖。 array.forEach(function(){if(typeof this ==='array'||'object'){this.forEach})類似的東西嗎? – Costa
你搖滾!非常感謝。 – Costa