Joi v14.3.1验证含动态键对象的正确Schema定义方法问询
解决Joi v14.3.1中动态键对象的验证问题
我来帮你搞定这个Joi验证的问题!你遇到的「Key email is not allowed」错误,根源在于用.concat()合并两个pattern Schema的思路不对——这会让Joi认为每个动态键的value必须同时满足email和webhook的结构,自然就产生了规则冲突。
正确的Schema定义方式
我们需要给动态键的value设置二选一的规则,用Joi.alternatives().try()来实现,具体代码如下:
const Joi = require('joi'); const obj = { actions: { dynamic_key_0: { email: { to: 'batman@mail.com' } }, dynamic_key_1: { webhook: { host: 'batman.com', method: 'get' } } } }; // 定义单个email类型的动作Schema const emailActionSchema = Joi.object({ email: Joi.object({ to: Joi.string().email().required() }).required() }); // 定义单个webhook类型的动作Schema const webhookActionSchema = Joi.object({ webhook: Joi.object({ host: Joi.string().required(), method: Joi.string().required() }).required() }); // 定义actions的Schema:任意字符串键,值是email或webhook二选一 const actionsSchema = Joi.object().pattern( Joi.string(), // 动态键为任意字符串 Joi.alternatives().try(emailActionSchema, webhookActionSchema) // 值满足两种结构之一即可 ); // 整体对象Schema const objSchema = Joi.object({ actions: actionsSchema.required() }); // 验证测试 const result = Joi.validate(obj, objSchema); console.log(result); // 此时error为null,验证完全通过
方案说明
.pattern(Joi.string(), 备选规则):指定actions下的键可以是任意字符串,对应的值匹配后面的备选规则即可。Joi.alternatives().try(a, b):表示值可以匹配a或者b的规则,二选一即可,不会像.concat()那样强制要求同时满足两个冲突的规则。
这样定义后,Joi会自动识别每个动态键的value是email还是webhook结构,分别进行针对性验证,不会再出现规则冲突的错误。
内容的提问来源于stack exchange,提问作者srgbnd
相关产品推荐
相关产品推荐

