Если 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