Joi Как разрешить неизвестное свойство, пока значение является строкой - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь сравнить между Джои или да. наш клиент переднего плана реагирует на использование formik, который также использует yup. сейчас мы разрабатываем сторону API для бэкэнда.

В любом случае, joi или yup могут сделать что-то подобное

value = {
 'en' : 'teststes'
 'fr' : 'aaaaa'
 ...
}

Я хотел бы проверить, что значение является строкой. у свойства может быть просто en или какая-либо другая языковая поддержка, о которой я не знаю в данный момент.

Мне также интересно, есть ли способ сделать это синхронно. Я знаю, да заставит меня сделать это асинхронно

1 Ответ

0 голосов
/ 18 октября 2019

Если value требуется string или object (с формой {en: "value", es : "value"}), вы можете добиться этого, используя

Joi.alternatives().try()

Полный код будет выглядеть следующим образом ..

const joiSchema = Joi.alternatives().try(Joi.string(),
  Joi.object({
    en: Joi.string()
        .required(),

    es: Joi.string()
        .required(), 
}))

const input1 = "Hello";
const input2 = {en: "Hi", es: "Hola"};


const joiResponse1 = joiSchema.validate(input1);
const joiResponse2 = joiSchema.validate(input2);
console.log(joiResponse1);
console.log(joiResponse2);

Если значение является объектом с известными ключами, скажем, «en» и «es» и неизвестными ключами, значение которых должно быть строкой, вы можете использовать Joi.pattern().

const joiSchema = Joi.object({
    en: Joi.string()
        .required(),

    es: Joi.string()
        .required(), 
}).pattern(Joi.string(), Joi.string())


const input = {en: "Hi", es: "Hola", ab: true};



const joiResponse = joiSchema.validate(input);
console.log(joiResponse);

Это синхронный вызов . Возвращаемое значение joiSchema.validate - это объект, имеющий следующую структуру.

{ error: undefined or validation errors if any,
  value: input value passed,
  then: [Function: then],
  catch: [Function: catch] 
}

Вы можете проверить joiResponse.error на достоверность или ложность, чтобы увидеть, есть ли какие-либо ошибки проверки.

Я не вижу подобной функции в Yup (возможно, я ошибаюсь, просто просматривая страницы документации). На мой взгляд, лучшее, что мы можем сделать, - это создать динамическую схему на основе объекта, используя Yup.lazy()

let yupSchema = yup.lazy(obj => {
  return yup.object(
    {
      ...Object.keys(obj).reduce((acc, key) => {
        acc[key] = yup.string().required()
        return acc;
      }, {}), 
      en: yup.string().required(),
      es: yup.string().required()
    }
  );
});

//This should fail 
const input3 = { en: "12", es: "Hola", fr: 1.1 };
yupSchema.validate(input3, {strict: true});

Как вы сказали, это возвращает обещание. Таким образом, вы должны обрабатывать успехи и неудачи, используя предложения then и catch возвращенного обещания.

Но для этого также существует версия синхронизации, yupSchema.validateSync, которая соответствует синтаксису, аналогичному yupSchema.validate

Согласно документации.

Запускает проверки синхронно, если это возможно, и возвращает результирующее значение, или выдает ValidationError

yupSchema.validateSync(input3, {strict: true})

Создан REPL длявам поиграть с другим подходом. https://repl.it/@nithinthampi/UntriedImpracticalShoutcast

Надеюсь, это поможет!

Соответствующие ссылки на документацию.

https://hapi.dev/family/joi/?v=16.1.7 https://github.com/jquense/yup#usage

...