【问题标题】:Calling object's method with only the string of the method's name仅使用方法名称的字符串调用对象的方法
【发布时间】:2014-12-09 12:46:34
【问题描述】:

我正在尝试使用express-validator 构建一个 Node.js 应用程序,这样我就可以像这样验证正文中的请求参数 -

req.checkBody('email_id', 'Invalid email ID!').notEmpty().isEmail();

现在我正在尝试构建一个大的 JSON 配置文件,该文件将包含应用程序中每个路由的所有字段及其规则(例如函数名称,例如 isEmail())。我想写一个中间件来拦截每个请求,找出路由,从 JSON 文件中获取字段及其验证规则,然后运行这些规则。配置文件看起来像这样 -

{
    "VALIDATION_RULES": {
        "/createUser": {
            "RULES": {
                "email_id": {
                    "message": "Invalid email ID!",
                    "rules": ["notEmpty","isEmail"]
                }
            }
        }
    }
}

我可以查看 express-validator 模块的导出以获取所有可用的验证函数名称。如果它们是独立的函数调用,我会看到如何只使用函数名称的字符串调用函数,如 herehere 所示。

如何选择规则(notEmptyisEmail),它们是 JSON 中的字符串,将它们转换为函数并将它们链接到 req.checkBody($field, $field.message)

【问题讨论】:

    标签: javascript json node.js validation


    【解决方案1】:

    您可以使用数组表示法来调用函数。

    这应该可行

    req.checkBody($field, $field.message)["notEmpty"]()

    req.checkBody($field, $field.message)["notEmpty"].apply()

    req.checkBody($field, $field.message)["notEmpty"].call()

    【讨论】:

      【解决方案2】:

      只需使用包含方法名称的变量来引用函数:

      var fields = {
        "email_id": {
          "message": "Invalid email ID!",
          "rules": ["notEmpty","isEmail"]
        }
      };
      
      // ...
      
      var keys = Object.keys(fields);
      for (var i = 0, len = keys.length, field, rules; i < len; ++i) {
        field = fields[keys[i]];
        rules = field.rules;
        var checker = req.checkBody(keys[i], field.message);
        for (var f = 0, lenf = rules.length; f < lenf; ++f)
          checker[rules[f]]();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多