Джой - сделать все необходимое по умолчанию? - PullRequest
0 голосов
/ 02 мая 2019

Я создаю Node / Express API и использую Joi для проверки.Это отличный пакет, и он невероятно полезен.Однако мы устали от таких вещей, как:

const mySchema = joi.object({
    thing1: joi.string().required(),
    thing2: joi.string().required(),
    thing3: joi.string().required(),
    thing4: joi.string().required(),
    thing5: joi.string().required(),
}).required();

Мы бы хотели, чтобы по умолчанию требовалось все , и вручную вызовите .optional, чтобы переопределить это.На самом деле это кажется разумным дефолтом - но пока оставим это в стороне.

Есть ли способ достичь этого?

1 Ответ

0 голосов
/ 02 мая 2019

Не существует стандартного способа сделать каждый требуемый ключ, но есть обходные пути.
Одним из обходных путей может быть использование .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);

Таким образом, вы сделаете все необходимые ключи, если не указано иное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...