#joi
#joi
Вопрос:
Я пытаюсь выполнить зависимую проверку на основе контекстной опции со схемой JOI.
let context = {
"User.HasChildren": false,
}
let schema = Joi.object({
"User.HasChildren": Joi.boolean(),
"User.Children": Joi.when("$User.HasChildren", {
is: true,
then: Joi.number().min(0).required(),
otherwise: Joi.any().forbidden()
}),
"User.ChildsYoungestAge": Joi.when("$User.HasChildren", {
is: true,
then: Joi.when("$User.Children", {
is: Joi.number().min(0),
then: Joi.number().required(),
otherwise: Joi.any().forbidden()
}),
otherwise: Joi.any().forbidden()
})
});
schema.validate({
"User.HasChildren": true,
"User.Children": 4,
"User.ChildsYoungestAge": 4
}, { context });
По сути .
, ошибка в имени ключа вызывает сбой. Если я удалю .
, я получу ожидаемый результат, но у меня нет контроля над именем ключа, поскольку оно поступает из объекта ответа API.
Я попытался изменить разделитель, options
но это не сработало, как я могу сообщить JOI, который .
является частью ссылки / ключа?
Ответ №1:
После дополнительного анализа я понял, что я на правильном пути, но неправильно определил разделитель. В принципе, я попытался установить его в функции проверки, но его нужно определять индивидуально для ссылки.
let context = {
"User.HasChildren": false,
}
let schema = Joi.object({
"User.HasChildren": Joi.boolean(),
"User.Children": Joi.when(Joi.ref("$User.HasChildren", { separator: false }), {
is: true,
then: Joi.number().min(0).required(),
otherwise: Joi.any().forbidden()
}),
"User.ChildsYoungestAge": Joi.ref("$User.HasChildren", { separator: false }), {
is: true,
then: Joi.when(Joi.ref("$User.Children", { separator: false }), {
is: Joi.number().min(0),
then: Joi.number().required(),
otherwise: Joi.any().forbidden()
}),
otherwise: Joi.any().forbidden()
})
});
schema.validate({
"User.HasChildren": true,
"User.Children": 4,
"User.ChildsYoungestAge": 4
}, { context });