Ошибка циклической зависимости Joi с условием when

У меня есть 3 параметра запроса: долгота, широта и радиус.

У меня есть 3 возможных условия:

  • radius — пусто, долгота и широта с некоторым значением
  • все 3 параметра со значением
  • все 3 параметра пусты

Во всех остальных случаях отправить ошибку проверки.

e.g.

долгота=3,12 — ошибка

широта=2,12, радиус=3,2 — ошибка

долгота=12,12, широта=2,12 – нормально

Моя схема выглядит так:

const schema = Joi.object().keys({
    longitude: Joi.number().optional().error(new Error('LBL_BAD_LONGITUDE'))
      .when('latitude', { is: Joi.exist(), then: Joi.number().required() })
      .when('radius', { is: Joi.exist(), then: Joi.number().required() }),
    latitude: Joi.number().optional().error(new Error('LBL_BAD_LATITUDE'))
      .when('longitude', { is: Joi.exist(), then: Joi.number().required() })
      .when('radius', { is: Joi.exist(), then: Joi.number().required() }),
    radius: Joi.number().optional().error(new Error('LBL_BAD_RADIUS')),
  });

В результате получаю ошибку

AssertionError [ERR_ASSERTION]: item added into group latitude created a dependencies error

Любая идея о том, как проверить эти 3 параметра?


person Dmytro Mysak    schedule 13.03.2019    source источник


Ответы (1)


Вы не за горами .. Хитрость здесь заключается в том, чтобы уловить ваше longitude and latitude with some value требование.

Joi.object().keys({
    radius: Joi.number(),
    latitude: Joi.number().when('radius', { is: Joi.exist(), then: Joi.required() }),
    longitude: Joi.number().when('radius', { is: Joi.exist(), then: Joi.required() })
}).and('latitude', 'longitude');

Модификатор .and() создает одноранговую зависимость между latitude и longitude; если один из них существует, то должен существовать и другой. Однако также допустимо опустить оба ключа, поскольку ни один из них не является обязательным (помогает с all 3 parameters empty).

Используя .and(), нам нужно только добавить модификации .when() в зависимости от того, существует radius или нет.

Допустимы только следующие форматы полезной нагрузки:

{
    latitude: 1.1,
    longitude: 2.2,
    radius: 3
}

{
    latitude: 1.1,
    longitude: 2.2
}

{}
person Ankh    schedule 13.03.2019