Joi Validation: как сделать значения во вложенном json необязательными?

Итак, у меня есть вложенный json, как показано ниже, который представляет собой структуру полезной нагрузки для API, которую я пишу.

{"item_id":"1245",
"item_name":"asdffd",
"item_Code":"1244",
"attributes":[{"id":"it1","value":"1"},{"id":"it2","value":"1"}],
"itemUUID":"03741a30-3d62-11e8-b68b-17ec7a13337"}

Моя проверка Joi на полезной нагрузке:

validate: {
                    payload: Joi.object({
                        item_id: Joi.string().required(),
                        item_name: Joi.string().required(),
                        placeId: Joi.string().allow('').allow(null),
                        itemUUID: Joi.string().allow('').allow(null),
                        item_Code: Joi.string().required().allow(null),
                        attributes: Joi.alternatives().try(attributeObjectSchema, attributesArraySchema).optional()
                    })
                }

куда

const attributeObjectSchema = Joi.object({
    id: Joi.string().optional(),
    value: Joi.string().optional()
}).optional();

и

const attributeArraySchema = Joi.array().items(customAttributeObjectSchema).optional();

Мой вопрос: с приведенной выше проверкой Joi, если я отредактирую свою полезную нагрузку и отправлю свой тег атрибутов, как показано ниже (т. Е. С пустыми «значениями»)

"attributes":[{"id":"CA1","value":""},{"id":"CA2","value":""}]

Выдает ошибку, говоря:

"message": "child \"attributes\" fails because [\"attributes\" must be an object, \"attributes\" at position 0 fails because [child \"value\" fails because [\"value\" is not allowed to be empty]]]",
  "validation": {
    "source": "payload",
    "keys": [
      "attributes",
      "attributes.0.value"
    ]

Что я здесь делаю неправильно? Что мне нужно сделать, если мне нужно, чтобы Джой принял следующее:

 "attributes":[{"id":"CA1","value":""},{"id":"CA2","value":""}]

person mmraj    schedule 24.04.2018    source источник


Ответы (2)


Сделайте что-нибудь вроде этого

attributeArraySchema.customAttributes = [];
attributeArraySchema.customAttributes = [
    {"id":"CA1","value":""},
    {"id":"CA2","value":""}
];
person Vikas Kandari    schedule 24.04.2018
comment
сначала объявите ключ с пустым массивом, затем назначьте данные ключа самым простым способом добавления пользовательских ключей в объект - person Vikas Kandari; 24.04.2018

Поэтому я решил это, изменив следующее определение схемы с

const attributeObjectSchema = Joi.object({
    id: Joi.string().optional(),
    value: Joi.string().optional()
}).optional();

To

const attributeObjectSchema = Joi.object({
    id: Joi.string().optional(),
    value: Joi.string().allow('').allow(null)
}).optional();
person mmraj    schedule 24.04.2018