在 JavaScript 中验证模板变量

Validating template variables in JavaScript

本文关键字:变量 验证 JavaScript      更新时间:2023-09-26

在使用模板引擎时是否有验证的最佳实践?

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

我建议编写一个函数来获取模板上下文对象并准备渲染。这些有时称为表示器函数和/或表示器模式。在渲染模板之前,您可以从节点.js路由函数使用它。此函数可以将 null/undefined 替换为空字符串,还可以检测toString为"[Object object]"或其他不需要的对象,并将它们替换为空字符串。为此编写单元测试很容易,并且无需在许多模板中复制逻辑。此函数应递归遍历整个对象图或对象图数组。

您可能还需要其他功能,例如缩写异常长的字符串。例如,如果有人不小心将一堆垃圾粘贴到用户对象的"firstName"字段中,并且这超过了 100 个字符的合理限制,则演示器函数可能会截断它并附加省略号。这只是此数据清理或"表示"类型逻辑的另一个示例。

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

这是一个第一次切割工作 jsfiddle 实现(使用下划线.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;
}