[英]How to use Joi to validate map object (map keys and map values)
比如有下面的map:
keys = type string, 5 characters long
values = type number
例子:
test = {
"abcde": 1
"12345": 2
"ddddd": 3
}
如何编写验证键的Joi Scheme是具有5个字符的字符串类型,值是数字类型
似乎您正在尝试使用未知密钥来验证对象,但是您知道该对象必须匹配哪种常规模式。 您可以使用Joi的.pattern()
方法实现此.pattern()
:
object.pattern(pattern, schema)
为匹配模式的未知密钥指定验证规则,其中:
pattern
一种模式,可以是正则表达式,也可以是joi模式,将针对未知的键名进行测试。
schema
模式对象匹配键必须进行验证。
因此,对于您的实例:
Joi.object().pattern(Joi.string().length(5), Joi.number());
首先,输入“test”的格式不正确。 输入 map 应如下所示:
test: [
["abcde", 1]
["12345", 2]
["ddddd", 3]
]
或者
test: [
["abcde", {id:1, val: 10}]
["12345", {id:2, val:11}]
["ddddd", {id:3, val:12}]
]
其次,joi 模式现在可以验证来自各种来源的输入,如下所示:
const varsSchema = joi.object({
TEST: joi.array().items(joi.string().required().valid(...test.keys((k) => k)))
.default(Array.from(test.keys()))
}).unknown()
.required();
const { 错误,值:vars } = varsSchema.validate(test); if (error) { throw new Error( validation error: ${error.message}
); }
上述模式将仅验证 map 的“密钥”,因为这是最常用的情况。
另请注意,map 数据可以来自环境变量或其他 object。
另外,请注意,如果您使用 pm2 和生态系统文件来传递环境变量,那么“map”类型的数据不会被正确解析,它会在您的 joi 文件中显示为字符串类型的数据。 这可以修复如下:
let envVars = { ...process.env };
if ('TEST' in envVars) { envVars['TEST'] = JSON.parse(envVars['TEST']); }
将上述代码视为将类型从字符串转换为 Map 类型。 然后您的架构验证的 rest 将正常工作。
请记住,原始 process.env 不能被覆盖。 尽管没有工具/编译器/解释器会给您警告,但覆盖 process.env 将不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.