繁体   English   中英

如何使用 Joi 验证 map object(映射键和 map 值)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM