在JavaScript中验证模板变量

时间:2012-05-19 17:57:12

标签: javascript node.js couchdb ejs

使用模板引擎时是否有最佳的案例练习?

我目前正在使用node.js和couchdb构建一个站点,我分别使用express和ejs作为框架和模板引擎。我最终可能会在[HTML对象]中使用[Object object]或者在我的HTML中拼写出未定义的内容。我可以尝试在couch中使用validate_doc_update函数进行验证,或者在我渲染到模板之前在路由函数内的节点中进行验证,或者在ejs模板中进行验证。我应该做以下哪一个或所有这些?

1 个答案:

答案 0 :(得分:1)

我建议编写一个函数来获取模板上下文对象并准备渲染。这些有时被称为演示者功能和/或演示者模式。在渲染模板之前,您可以使用node.js路由功能中的这个。此函数可以用空字符串替换null / undefined,并检测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;
}