Joi проверяет отдельные поля вложенной схемы

У меня есть такая настройка вложенной схемы:

var schema = Joi.object().keys({
  first_name: Joi.string().required(),
  last_name: Joi.string().required(),
  address: Joi.object().keys({
    street: Joi.string().required(),
    zip: Joi.number().required(),
    state: Joi.string().required(),
    country: Joi.string().required()
  }).required(),
})

var options = { abortEarly: false };

var result = Joi.validate({}, schema, options);

При запуске result.error вернет сообщение:

[
  {message: '"first_name" is required', path: 'first_name' }, 
  {message: '"last_name" is required', path: 'last_name' },
  {message: '"address" is required', path: 'address' }
]

Как видите, поле address не расширяется. Я не хочу получать сообщение об отсутствии всего поля адреса. Вместо этого я хочу быть проинформированным об отсутствии отдельных элементов в схеме адреса. Когда я не делаю address явно обязательным, элементы в нем вообще не проверяются на required(). Проверка вложенного поля, похоже, работает только на уровне объекта вложенной схемы в целом, а не на отдельных элементах на уровне схемы. Как заставить его работать с отдельными элементами вложенной схемы?


joi
person pkout    schedule 18.05.2016    source источник
comment
Удалось ли вам это решить?   -  person J. Pichardo    schedule 22.03.2017


Ответы (1)


Добавление «скелета» объекта работает. Рабочий пример здесь.

import Joi, {
  string,
  number,
  object
} from "joi";

var schema = object({
  first_name: string().required(),
  last_name: string().required(),
  address: object({
    street: string().required(),
    zip: number().required(),
    state: string().required(),
    country: string().required()
  })/*.required(), <= Not needed */
})
var skeleton = { address: {} };

var options = { abortEarly: false };

var validate = data => {
  var newData = Object.assign({}, skeleton, data);
  return Joi.validate( newData, schema, options);
}
console.log(
  JSON.stringify(validate({}).error.details, null, 2)
);

Результат:

[
  {
    "message": "\"first_name\" is required",
    "path": "first_name",
    "type": "any.required",
    "context": {
      "key": "first_name"
    }
  },
  {
    "message": "\"last_name\" is required",
    "path": "last_name",
    "type": "any.required",
    "context": {
      "key": "last_name"
    }
  },
  {
    "message": "\"street\" is required",
    "path": "address.street",
    "type": "any.required",
    "context": {
      "key": "street"
    }
  },
  {
    "message": "\"zip\" is required",
    "path": "address.zip",
    "type": "any.required",
    "context": {
      "key": "zip"
    }
  },
  {
    "message": "\"state\" is required",
    "path": "address.state",
    "type": "any.required",
    "context": {
      "key": "state"
    }
  },
  {
    "message": "\"country\" is required",
    "path": "address.country",
    "type": "any.required",
    "context": {
      "key": "country"
    }
  }
]
person Ashley Coolman    schedule 01.06.2017