Joi验证对象列表,如果所有对象都在一个对象中,则所有对象都必须包含可选键

时间:2019-07-11 20:30:07

标签: javascript node.js rest joi

我有一个带有以下必需键的对象列表:

  

日期,时间,价格

我想添加一个可选键“ order”,并且如果这些对象之一包含该可选键,它们都必须。我将如何与joi进行验证?

1 个答案:

答案 0 :(得分:0)

您可以根据要验证的阵列动态创建架构。如果数组具有某些具有order属性的对象,则架构应要求数组中每个对象都具有此属性,否则,架构应将此属性视为可选:

const schemaFactory = input =>
  Joi.array().items(
    Joi.object().keys({
      Date: Joi.required(),
      Time: Joi.required(),
      Price: Joi.required(),
      order: input.some(item => item.hasOwnProperty('order'))
        ? Joi.required()
        : Joi.optional()
    })
  )

const input = [
  { Date: 1, Time: 2, Price: 3 },
  { Date: 1, Time: 2, Price: 3, order: true },
]

const schema = schemaFactory(input)
const result = schema.validate(input)

if (result.error) {
  console.log(result.error)
}
<script src="https://cdn.jsdelivr.net/npm/joi-browser@13.4.0/dist/joi-browser.min.js"></script>