Проверка Joi по умолчанию установлена ​​как пустой объект

У меня возникла проблема (или, как мне кажется, одна) с проверкой Joi. Я пытаюсь присвоить значение несуществующему ключу, если он был передан как часть тела запроса.

Так например:

parameters: Joi.object().keys({
  keyA: Joi.string().allow('').allow(null).default(null),
  keyB: Joi.object().keys({
    b1: Joi.string(),
    b2: Joi.string(),
    b3: Joi.object().keys({
      b3_1: Joi.string(),
      b3_2: Joi.string(),
      b3_3: Joi.string()
    })
  }).default({}),
  keyC: Joi.object().keys({
    c1: Joi.number(),
    c2: Joi.number(),
    c3: Joi.boolean(),
    c4: Joi.boolean()
  }).default({}),
  keyD: Joi.object().keys({
    d1: Joi.number(),
    d2: Joi.number()
  }).default({}),
  keyE: Joi.object().keys({
    e1: Joi.number()
  }).default({}) 
}).allow(null)

Итак, чтобы быть конкретным, если бы я передал:

{
  keyA: "foo",
  keyD: {
    d1: 21.9,
    d2: 21.1
  },
  keyE: {
    e1: 42
  }
}

Я бы получил это взамен

{
  keyA: "foo",
  keyB: {},
  keyC: {},
  keyD: {
    d1: 21.9,
    d2: 21.1
  },
  keyE: {
    e1: 42
  }
}

С: глазами: на пустых предметах. Что мне не хватает в методе Joi.default ()? Не слишком ли я растягиваю то, для чего предназначена Джой?


person bneigher    schedule 30.03.2017    source источник
comment
Обратите внимание, что я не вижу ошибок проверки - я просто не получаю желаемый результат   -  person bneigher    schedule 30.03.2017


Ответы (2)


Я начну с указания, что схема в вашем вопросе недействительна JavaScript, вы закрыли слишком много скобок, прежде чем объявить правило для keyC. Я предполагаю, что это просто ошибка форматирования вопроса, и ваша фактическая схема в настоящее время действительна.

Во-вторых, нет ничего плохого в том, как вы объявили свои значения по умолчанию ... все работает нормально. Я предполагаю, что проблема заключается в том, как вы проверяете схему.

Попробуйте запустить это. Я воспроизвел метод проверки в документах для _2 _ .

const schema = Joi.object().keys({
    keyA: Joi.string().allow('').allow(null).default(null),
    keyB: Joi.object().keys({
        b1: Joi.string(),
        b2: Joi.string(),
        b3: Joi.object().keys({
            b3_1: Joi.string(),
            b3_2: Joi.string(),
            b3_3: Joi.string()
        })
    }).default({}),
    keyC: Joi.object().keys({
        c1: Joi.number(),
        c2: Joi.number(),
        c3: Joi.boolean(),
        c4: Joi.boolean()
    }).default({}),
    keyD: Joi.object().keys({
        d1: Joi.number(),
        d2: Joi.number()
    }).default({}),
    keyE: Joi.object().keys({
        e1: Joi.number()
    }).default({})
}).allow(null);

Joi.validate({
    keyA: "foo",
    keyD: {
        d1: 21.9,
        d2: 21.1
    },
    keyE: {
        e1: 42
    }
}, schema, (err, value) =>
{
    if (err)
        throw err;

    console.log(value);
});

Я получаю это в консоли:

{
    keyA :'foo',
    keyD: {
        d1: 21.9,
        d2: 21.1
    },
    keyE: {
        e1: 42
    },
    keyB: {},
    keyC: {}
}

Ключи вряд ли будут выглядеть упорядоченными, как ваш ожидаемый результат, но это не имеет значения как объект ключи все равно не заказываются.

person Ankh    schedule 30.03.2017
comment
Да, вы правы - проблема оказалась во внешней библиотеке, которая удаляла пустые объекты. - person bneigher; 30.03.2017

Вы можете установить значения по умолчанию, вы должны попробовать это:

parameters: Joi.object().keys({
  keyA: Joi.string().allow(null).default(null),
  keyB: Joi.object().keys({
    b1: Joi.string().default("abc"),
      b2: Joi.string().default("abc"),
      b3: Joi.object().keys({
        b3_1: Joi.string().default("abc"),
        b3_2: Joi.string().default("abc"),
        b3_3: Joi.string().default("abc")
      })
    })
  }).default({}),
  keyC: Joi.object().keys({
    c1: Joi.number().default(0),
    c2: Joi.number().default(0),
    c3: Joi.boolean().default(0),
    c4: Joi.boolean().default(0)
  }).default({}),
  keyD: Joi.object().keys({
    d1: Joi.number().default(0),
    d2: Joi.number().default(0)
  }).default({}),
  keyE: Joi.object().keys({
    e1: Joi.number().default(0)
  }).default({}) 
}).allow(null)
person Shubham Verma    schedule 30.03.2017
comment
Спасибо, что вернулись! Цель состоит в том, чтобы установить значения по умолчанию для объектов как пустые объекты. Меня не беспокоят значения ключей объекта - они нужны только для того, чтобы показать мой пример. - person bneigher; 30.03.2017
comment
Кажется, что Joi.object (). Default () не соблюдается - person bneigher; 30.03.2017