我有一个可以是多种类型之一的字段。每种类型都有不同的架构。我尝试使用Joi.alternativesJSON 来验证请求。但是,我想消除内部验证函数中的错误。目前alternatives用它的错误消息覆盖它。
例如,我有一个现场调用customer,可以是 abusiness或 a person。如果客户是 a person,则仅name存在字段。
{
"customer": {
"name": "John Doe"
},
...
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果客户是 a,business则name和businessCode字段都会出现。
{
"customer": {
"name": "My Company",
"businessCode": 1820
},
...
}
Run Code Online (Sandbox Code Playgroud)
我进行验证:
Joi.alternatives()
.match("one")
.try(
Joi.object<Person>({
name: Joi.string().required()
}).unknown(false).required(),
Joi.object<Business>({
name: Joi.string().required(),
businessCode: Joi.number().integer().positive().required()
}).unknown(false).required()
)
Run Code Online (Sandbox Code Playgroud)
我过去常match('one')指定应匹配其中一个business或,但不能同时匹配两者。person当我传递一个无效的businessCode像时{"businessCode": -999},Joi 抛出
“客户”与任何允许的类型都不匹配
这不如提供诸如“业务代码为负,这是不允许的业务”之类的消息那么有帮助。我们知道这是一门生意,因为一个人没有任何商业代码。如何消除内部验证中的错误?我想到的另一种选择是进行两次验证,在验证字段存在后验证字段,但我不确定如何在 Joi 中执行此操作。
这在最新的 joi 中是不可能的。
在你的场景中你说
“企业代码为负数,这是不允许的企业”
但为了建立这一点,您暗示此处匹配的替代方案是“业务”,而实际上(从 joi 的 PoV 来看),输入既未能满足业务模式的要求,也未能满足个人模式的要求。
对于使用 时报告特定错误的问题alternatives,我的解决方案是通过不同的模式手动运行输入,然后创建一个聚合响应,看起来类似于“此输入失败了模式 A,因为缺少 X,失败了模式 B,因为它缺少 Y”
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |