我正在尝试使用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模块的导出以获取所有可用的验证函数名称。如果它们是独立的函数调用,我会看到如何使用它的名称字符串调用该函数,如here和here所示。
如何选择规则(notEmpty
或isEmail
),这些规则是JSON中的字符串,将它们转换为函数并将它们链接到req.checkBody($field, $field.message)
?
答案 0 :(得分:2)
您可以使用数组表示法来调用该函数。
这应该有效
req.checkBody($field, $field.message)["notEmpty"]()
或
req.checkBody($field, $field.message)["notEmpty"].apply()
或
req.checkBody($field, $field.message)["notEmpty"].call()
答案 1 :(得分: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]]();
}