首页 > 解决方案 > Joi 验证对象列表,如果它在一个对象中,则所有对象都必须包含可选键

问题描述

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

日期、时间、价格

我想添加一个可选键“订单”,如果这些对象之一包含该可选键,它们都必须。我将如何用 joi 验证这一点?

标签: javascriptnode.jsrestjoi

解决方案


您可以根据要验证的数组动态创建模式。如果数组有一些具有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>


推荐阅读