要求
该对象有两个属性:
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(),
});