在使用模板引擎进行验证时是否存在最佳案例练习?在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