Доступ к ссылке JOI, где ключ включает точку

#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 });