Использование проверки цепочки для проверки наличия дополнительных полей с помощью экспресс-валидатора

Я пытаюсь проверить наличие необязательного поля в запросе API, и если это поле существует, выполнить вложенную проверку, чтобы проверить, существуют ли внутри него два других поля (одно или другое или неявно оба). Я использую Express Validator, чтобы попытаться выполнить эту задачу.

// Sample request body
{
  <...>
  thresholds: {
    min: 3,
    max: 5
  }
}

// (Attempted) validation chain
check('thresholds').optional()
      .custom( innerBody => {
          console.log('THRESHOLDS', innerBody);
          oneOf([
              check('innerBody.min').optional(),
              check('innerBody.max').optional()
          ]);
      })

Приведенный выше фрагмент является частью более крупной цепочки проверки, в которой я проверяю полное тело запроса. Я также попытался удалить строку innerBody. из внутренних check, но все равно не повезло. Я console.log печатаю тело порога, и оно распечатывается правильно, однако я все равно получаю сообщение об ошибке проверки, когда пытаюсь пройти тест интеграции:

{"name":"ValidationError","message":"ValidationError: Validation failed","errors":[{"location":"body","param":"thresholds","value":{"min":3,"max":5},"msg":"Invalid value"}]}

Я относительно новичок в Express Validator, поэтому, если я неправильно связываю валидацию / не использую oneOf правильно, или что-то будет любить некоторые указатели!

Спасибо


person Ethan Fox    schedule 08.10.2019    source источник


Ответы (2)


Похоже, функция .custom должна возвращать Promise. Ответ ниже:

.custom(innerBody => {
            if (!(innerBody.min) || !(innerBody.max)) return Promise.reject('Missing min or max');
            return Promise.resolve();
        })
person Ethan Fox    schedule 09.10.2019

Помните: всегда возвращайте логическое значение из обратного вызова функции .custom (). В противном случае ваша проверка может не работать должным образом.

Источник: Custom руководство по валидации

В общем, вам может понадобиться использовать Promises, если вы имеете дело с асинхронной .custom() функцией. Затем вы должны будете вернуть Promise.resolve() / Promise.reject() для правильного поведения валидатора.

Источник: SO answer

person Hlib Derbenov    schedule 18.10.2019