【问题标题】:Validating template variables in JavaScript在 JavaScript 中验证模板变量
【发布时间】:2012-05-19 17:57:11
【问题描述】:

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

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

【问题讨论】:

    标签: javascript node.js couchdb ejs


    【解决方案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;
    }
    

    【讨论】:

    • 谢谢!很好的解决方案。嗯..我敢打赌,可以编写一个适用于我所有模板的演示者函数。你能发布一个例子吗?我在思考如何递归遍历整个对象图时遇到了麻烦。 array.forEach(function () {if (typeof this === 'array' || 'object') {this.forEach}) 是这样的吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2021-06-14
    • 2014-07-15
    • 2014-04-08
    • 2020-09-09
    • 2023-04-01
    相关资源
    最近更新 更多