Joi.custom()验证器不会在未提供的字段上执行



要求

该对象有两个属性:

  • number,我们称之为firstField
  • 一个string,我们称之为secondField

现在是验证要求

  • firstField始终为required
  • firstField等于1时,需要secondField。以及当firstField不是1时的forbidden

使用.when()可以很容易地解决这个问题

但实际上,为了确定是否需要secondField,我必须根据firstField和验证上下文中的一个变量进行一些检查。

当前代码

Joi.object({
firstField: Joi.number().required(),
secondField: Joi.custom((value, helpers) => {
if (firstField === helpers.prefs.context.someValue) {
// test secondField with forbidden and return error when secondField is provided, otherwise return value
}
// test secondField with required and return error when secondField is not provided, otherwise return value
}),
});

现在我的问题是,当我发送时,自定义验证器不会被执行

{
firstField: "test",
}

但我希望它执行

我尝试了什么

  • 当我在输入中提供secondField时,自定义验证器确实会被执行
  • 当我使用.when()而不是自定义验证器时,即使没有提供secondField,也会执行.when()
  • 所以我试着在自定义验证器前面放一个.when("firstField", { is: Joi.any(), then: Joi.any(), otherwise: Joi.any()}),但仍然没有成功

我真的试过很多

我看到的最后一个解决方案是将自定义验证器放在字段的父对象上,并在验证上下文的上下文中测试子字段

解决这个问题的最佳方法是什么?是否建议直接在现场进行禁止/要求的测试,或者应该一直在家长身上进行测试?

根据文档,您可以使用.ref()访问上下文值:

ref(键,[选项])

如果键以$is开头,则表示在上下文选项对象中查找的上下文引用。

来源:https://joi.dev/api/?v=17.7.0#refkey-选项

有了这个,你可以利用when()来表达你的状况:

Joi.when("firstField", {
is: Joi.ref("$someValue"),
then: Joi.forbidden(),
otherwise: Joi.string(),
});

相关内容

  • 没有找到相关文章

最新更新