Как проверить вложенный объект, ключи которого должны совпадать с внешними объектами, другой ключ, значение которого является массивом, используя Joi? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть объект, который я хочу проверить.

// valid object because all values of keys are present in details object
var object = {
    details: {
        key1: 'stringValue1',
        key2: 'stringValue2',
        key3: 'stringValue3'
    },
    keys: ['key1', 'key2', 'key3']
}

// invalid object as key5 is not present in details
var object = {
    details: {
        key4: 'stringValue4'
    },
    keys: ['key4', 'key5']
}

// invalid object as key5 is not present and key8 should not exist in details
var object = {
    details: {
        key4: 'stringValue4',
        key8: 'stringValue8',            
    },
    keys: ['key4', 'key5']
}

Все ключи, присутствующие в keys, должны присутствовать и в details.

Я пробовал это с помощью Joi.ref ()

var schema = Joi.object({
    details: Joi.object().keys(Object.assign({}, ...Object.entries({...Joi.ref('keys')}).map(([a,b]) => ({ [b]: Joi.string() })))),
    keys: Joi.array()
})

Но это не работает, потому что Joi.ref('keys') будет решено во время проверки.

Как проверить этот объект с помощью Joi ?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2019

Использование object.pattern и array.length

var schema = Joi.object({
  details: Joi.object().pattern(Joi.in('keys'), Joi.string()),
  keys: Joi.array().length(Joi.ref('details', {
      adjust: (value) => Object.keys(value).length
    }))
});

stackblitz

0 голосов
/ 07 ноября 2019

Вы можете проверить массив (если хотите), затем создать динамическую схему и проверить ее.

const arrSchema = Joi.object({
    keys: Joi.array()
});

затем

const newSchema = Joi.object({
    details: Joi.object().keys(data.keys.reduce((p, k) => {
        p[k] = Joi.string().required();
        return p;
    },{})),
    keys: Joi.array()
})

Это, вероятно, должно сделать это.

Вы должны установить allowUnknown: true в опции validate().

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