函数参数的自动验证"/>
Joi:函数参数的自动验证
[我看到一个代码库正在使用joi
库,如下所示:
function f(a, b) {
// ...
}
f.schema = {
a: Joi.string().uuid().required(),
b: Joi.number()
}
然后f.schema
属性未在其他任何地方引用。是否有一些框架可以使用schema
属性执行功能参数的自动验证?谷歌搜索并没有带来任何好处。
[我不认为有可能完全按照您在此处显示的内容进行操作,因为Javascript中是overloading of function call is impossible,但是有一种方法可以使用Proxies进行类似的操作。
这是我设法做到的。我们创建一个validated
代理对象,该对象将覆盖apply
行为,该行为对应于标准函数调用以及apply
和call
方法。
代理检查函数上是否存在schema
属性,然后使用schema
数组的元素验证每个参数。
const Joi = require('joi');
const validated = function(f) {
return new Proxy(f, {
apply: function(target, thisArg, arguments) {
if (target.schema) {
for (let i = 0; i < target.length; i++) {
const res = target.schema[i].validate(arguments[i]);
if (res.error) {
throw res.error;
}
}
}
target.apply(thisArg, arguments)
}
})
}
const myFunc = validated((a, b) => {
console.log(a, b)
});
myFunc.schema = [
Joi.string().required(),
Joi.number(),
];
myFunc('a', 2);
更多推荐
Joi:函数参数的自动验证
发布评论