Сообщение от пользовательского валидатора Yup возвращает неопределенное имя пути и ссылку - PullRequest
1 голос
/ 19 апреля 2020

Я пытаюсь написать пользовательский тест для библиотеки проверки yup для использования в приложении узла / express, которое проверяет, совпадают ли два поля - пример использования, например, проверка соответствия полей пароля и подтверждения пароля. Лог c работает, однако сообщение, предоставленное методом, не является.

Пользовательский код проверки изменен с: https://github.com/jquense/yup/issues/97#issuecomment -306547261

Пользовательский валидатор

yup.addMethod(yup.string, 'isMatch', function (ref, msg) {
  return this.test({
    name: 'isMatch',
    message: msg || `${this.path} must be equal to ${this.reference}`,
    params: {
      reference: ref.path
    },
    test: function (value) {
      return value === this.resolve(ref);
    }
  });
});

Пример использования

const schema = yup.object().shape({
  password: yup.string().min(8),
  passwordConfirm: yup.string().isMatch(yup.ref('password'))
})

const payload = {
  password: 'correctPassword',
  passwordConfirm: 'incorrectPassword'
}

schema.validate(payload)

Вышеуказанный метод работает, как и ожидалось, с точки зрения логики c. Однако в возвращенном сообщении об ошибке значения this.path и this.reference равны undefined (то есть undefined must be equal to undefined). Он должен читать passwordConfirm must be equal to password.

Я должен был добавить this. перед path и reference, в противном случае происходит сбой узла с ReferenceError, что path/reference is not defined.

1 Ответ

0 голосов
/ 26 апреля 2020

Вам не нужно писать пользовательскую функцию проверки, чтобы проверить, совпадают ли два поля, вы можете использовать встроенный валидатор .oneOf

Белый список набора значений. Добавленные значения автоматически удаляются из любого черного списка, если они есть в нем. Интерполяция $ {values} может использоваться в аргументе сообщения.

Обратите внимание, что undefined не завершает этот валидатор, даже если undefined не включен в arrayOfValues. Если вы не хотите, чтобы undefined был допустимым значением, вы можете использовать mixed.required.

См. Здесь ref: oneOf (arrayOfValues: Array, message ?: string | function): Псевдоним схемы: равно

Таким образом, вы можете переписать свою схему следующим образом (я добавил обязательные поля пароля):

const schema = yup.object().shape({
  password: yup.string().min(8).required('Required!'),
  passwordConfirm: yup.string().oneOf([Yup.ref('password')], 'Password must be the same!').required('Required!')
})
...