Джой круговая ошибка зависимости с условием когда - PullRequest
0 голосов
/ 13 марта 2019

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

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

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

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

например

долгота = 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 параметра?

1 Ответ

1 голос
/ 13 марта 2019

Вы не далеко ... хитрость заключается в том, чтобы подобрать ваше требование 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 илиnot.

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

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

{
    latitude: 1.1,
    longitude: 2.2
}

{}
...