如何正确消除 Joi.alternatives 中的错误?

kri*_*ath 5 typescript joi

我有一个可以是多种类型之一的字段。每种类型都有不同的架构。我尝试使用Joi.alternativesJSON 来验证请求。但是,我想消除内部验证函数中的错误。目前alternatives用它的错误消息覆盖它。

例如,我有一个现场调用customer,可以是 abusiness或 a person。如果客户是 a person,则仅name存在字段。

{
  "customer": {
    "name": "John Doe"
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果客户是 a,businessnamebusinessCode字段都会出现。

{
  "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 中执行此操作。

mca*_*ral 0

这在最新的 joi 中是不可能的。

在你的场景中你说

“企业代码为负数,这是不允许的企业”

但为了建立这一点,您暗示此处匹配的替代方案是“业务”,而实际上(从 joi 的 PoV 来看),输入既未能满足业务模式的要求,也未能满足个人模式的要求。

对于使用 时报告特定错误的问题alternatives,我的解决方案是通过不同的模式手动运行输入,然后创建一个聚合响应,看起来类似于“此输入失败了模式 A,因为缺少 X,失败了模式 B,因为它缺少 Y”