2014-12-09 32 views
0

我想建立使用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"] 
       } 
      } 
     } 
    } 
} 

我可以看看快递验证器模块的出口得到所有可用的验证功能名称。如果他们是独立的函数调用,我会看到如何使用它的名称字符串调用该函数,如herehere所示。

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

回答

2

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

这应该工作

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

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

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

2

只是参考使用V功能易于使用的方法名称:

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]](); 
} 
相关问题