2012-05-19 41 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