【问题标题】:Joi not accepting correct string value with valid ()Joi 不接受具有有效 () 的正确字符串值
【发布时间】:2021-10-19 02:51:47
【问题描述】:

我有一个带有下拉输入的表单,所以该输入的选项已经设置好了。

问题是输入的值,尽管是正确的,并且在架构的可接受值范围内,但我收到了 Provider must be one of [[object Set], [object Set]] 的消息。

最奇怪的是这个问题在生产中出现,但在localhost 我没有收到这个验证错误。

provider 来自schema 的键:

 provider: Joi.string().required().label('Provider').when('entitlementType', {
    is: 'Offer', 
    then: Joi.string().valid(...providersForSubscriptions),
    otherwise: Joi.string().valid(...providersForProducts),
  }),

providersForSubscriptions数组:

[
    "RBL",
]

providersForProducts数组:

[
    "RBL",
    "content-store",
    "zencore",
    "VIP"
]

如您所见,这是一个非常简单的验证,它将接收一些 provider 值,并且如果它在 valid 数组中,它将接受该值。

在浏览器中记录表单。

console.log(entitlementType, provider, providersForProducts);

这是输出:

那么发生了什么?如果我们检查验证警告中的context,则输入值为zencorezencore 被视为有效值。

有什么想法吗?我应该尝试重构架构吗?为什么这只是产品?

【问题讨论】:

    标签: javascript reactjs joi


    【解决方案1】:

    来自您的架构:

    provider: Joi.string().required().label('Provider').when('entitlementType', {
        is: 'Offer', 
        then: Joi.string().valid(...providersForSubscriptions),
        otherwise: Joi.string().valid(...providersForProducts),
      }),
    

    而您的输出,我们可以看到entitlementType 不提供。这意味着

    Joi.string().valid(...providersForProducts),
    

    正在用于验证此特定字段。

    我们还可以看到错误Provider must be one of [[object Set], [object Set]],这意味着 Joi 正在检查一组集合。

    这表明我们providersForProducts 是罪魁祸首。

    为什么它是一组集合?谁知道。记录该值以确认,然后返回查看为什么设置它。

    【讨论】:

    • 我正在简化providerForProducts 数组,但实际上该数组来自static keyProvider = Object.freeze({ contentStore: 'content-store', rbl: 'RBL', xchange: 'xchange', zencore: 'zencore', vip: 'VIP' }); 类的导入static 属性
    • 实际上,如果与_.isArrray(providersForProducts) 核对,我会得到真实的。所以我不知道为什么它要检查一组集合哈哈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2019-12-20
    • 2021-06-26
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多