在JavaScript中validation模板variables

使用模板引擎进行validation时,是否有最佳实践?

我目前正在用node.js和couchdbbuild立一个站点,而且我正在用ejs作为框架和模板引擎。 我可能最终得到的是[Object object],或者是我的HTML中未定义的拼写。 我可以尝试在沙发上使用validate_doc_update函数进行validation,或者在渲染到模板之前,或者在我的路由函数中的节点中,或者在ejs模板中进行validation。 我应该做哪一个或所有这些?

我build议编写一个函数来获取您的模板上下文对象,并为渲染做好准备。 这些有时被称为演示者function和/或演示者模式。 在渲染模板之前,你可以使用你的node.js路由function。 该函数可以用空stringreplacenull / undefined,还可以检测toString为“[Object object]”或其他不合要求的对象,并将它们replace为空string。 为此编写unit testing很容易,并且会阻止您在许多模板中重复逻辑。 该函数应该recursion地遍历整个对象图或对象图的数组。

您可能还需要其他function,如缩短exception长的string。 例如,如果有人不小心将一堆垃圾粘贴到用户对象的“firstName”字段中,并且这已经超过了100个字符的理智限制,则演示者函数可以截断它并附加一个省略号。 这个数据清理或“演示”types逻辑的另一个例子。

否则,你需要像<%= someObj.someProp || '' %>这样的expression式 <%= someObj.someProp || '' %>在您的ejs模板,这将导致大量的样板代码重复。

这里有一个首要的工作jsfiddle实现 (使用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; }