Как динамически скопировать часть схемы Joi для использования в локальной схеме?

Я работаю над проектом, чтобы научиться использовать библиотеку Joi в React. Преподаватель использует более старую, устаревшую версию библиотеки, поэтому я работаю над преобразованием версии для инструкторов для использования нового синтаксиса. Мне нужно передать объект Joi для схемы и проверить вызов этого объекта с помощью объекта, который я проверяю, в качестве первого аргумента.

У меня возникли проблемы с выяснением того, как динамически вызывать значение объекта Joi для передачи в новую схему.

Вот мой код в том виде, в котором он сейчас используется, с использованием Joi v16.


     schema = Joi.object({
        username: Joi.string()
          .alphanum()
          .min(3)
          .required()
          .label("Username"),
        password: Joi.string()
          .min(5)
          .required()
          .label("Password")
      });

  validateProperty = ({ name, value }) => {
    const obj = { [name]: value };
    const localSchema = Joi.object({ [name]: "" }); //The copied schema segment goes here in place of the empty string.
    const { error } = localSchema.validate(obj);
    return error ? error.details[0].message : null;
  };

Моя интуиция такова, что это «кажется» неправильным, как будто я должен делать это гораздо проще... но я не уверен, что делать, чтобы двигаться вперед.

Для сравнения вот пример инструктора, написанный на Joi v13.

  validateProperty = ({ name, value }) => {
    const obj = { [name]: value };
    const schema = { [name]: this.schema[name] };
    Joi.validate(obj, schema);
    return error ? error.details[0].message : null;
    };

person Turkinolith    schedule 19.12.2019    source источник


Ответы (2)


Ничего себе, нашел ответ сам!

Вместо того, чтобы объявлять мою схему как объект Joi.object, я объявил ее как стандартный объект JS. Затем в моем методе я создаю локальную константу, которая ее фильтрует, ЗАТЕМ оборачивает ее в объект Joi.object и переходит к проверке.


  schema = {
    username: Joi.string()
      .alphanum()
      .min(3)
      .required()
      .label("Username"),
    password: Joi.string()
      .min(5)
      .required()
      .label("Password")
  };

  validateProperty = ({ name, value }) => {
    const obj = { [name]: value };
    const localSchema = Joi.object({ [name]: this.schema[name] });
    const { error } = localSchema.validate(obj);
    return error ? error.details[0].message : null;
  };

person Turkinolith    schedule 20.12.2019

person    schedule
comment
после мозгового штурма это то, что я придумал, и это работает гладко - person keneboy; 18.06.2021