Не существует стандартного способа сделать каждый требуемый ключ, но есть обходные пути.
Одним из обходных путей может быть использование .requiredKeys()
и .optionalKeys()
на Joi.object()
Посмотрите на .describe()
функцию,
Возвращает объект с ключом flags
.
Когда ключ помечен как «необязательный», мы получаем flags.presence = 'optional'
Используя эту информацию, вы можете вызвать .describe()
для каждой клавиши и подготовить два массива requiredKey
и optionalKeys
И затем вы можете передать эти массивы в .requiredKeys()
и .optionalKeys()
соответственно.
Например:
Допустим, вы определили свою схему joi как:
const joiSchemaKeys = {
thing1: Joi.string(),
thing2: Joi.string().optional(),
thing3: Joi.string(),
thing4: Joi.string(),
thing5: Joi.string().required()
};
Затем вы можете подготовить два массива optionalKeys
и requiredKeys
, используя это:
const initialKeyInformation = {
requiredKeys: [],
optionalKeys: []
};
const prepareKeysInformation = keys =>
Object.keys(keys).reduce((accumulated, aKey) => {
const description = keys[aKey].describe();
const isMarkedOptional =
description.flags &&
description.flags.presence &&
description.flags.presence === "optional";
if (isMarkedOptional) {
console.log(`"${aKey}" is marked optional`);
accumulated.optionalKeys.push(aKey);
} else {
console.log(`"${aKey}" is not marked, making it required`);
accumulated.requiredKeys.push(aKey);
}
return accumulated;
}, initialKeyInformation);
const { optionalKeys, requiredKeys } = prepareKeysInformation(joiSchemaKeys);
Как только это будет сделано, вы можете подготовить свою схему joi, например:
const schema = Joi.object()
.keys(joiSchemaKeys)
.requiredKeys(requiredKeys)
.optionalKeys(optionalKeys);
Таким образом, вы сделаете все необходимые ключи, если не указано иное.