如何使用 Joi 嵌套所需的未知键值对象

How to have a nested required unknown key-value object with Joi

我正在尝试创建一个模式验证来接受这个:

甲:

{
 "user_token": "test",
 "accounts":{
   "any_key":[0, 1]
 }
}

或者这个 乙:

{
 "user_token": "e29a64c4c9f08414cc2999a0166664f8",
 "accounts":{
   "some_other_key":[0, 1]
 }
}

但不是这个 C:

{
 "user_token": "e29a64c4c9f08414cc2999a0166664f8",
 "accounts":{}
}

它基本上应该接受 accounts 下可以接受任何键值的对象。

我查看了 Joi's documentation 中的 .unknown 但我无法实现它,因为我试图实现它的对象是一个数组

const statementsSchema = {
  body: Joi.object({
    user_token: Joi.string().required(),
    accounts: Joi.object({
      Joi.array().unknown().required()
    }).required()
  })
}

我也尝试了 .pattern,它几乎可以工作,但它不会强制要求 accounts 内的对象。

const statementsSchema = {
  body: Joi.object({
    user_token: Joi.string().required(),
    accounts: Joi.object({}).pattern(/./, Joi.array()).required()
  })
}

是否可以 accounts 在不指定键的情况下要求单个子数组?

你非常接近。缺少的部分是使用 object.min() 指定 accounts 对象中允许的最小键数。在您的情况下,最少的键数是 1.

const statementsSchema = {
    body: Joi.object({
        user_token: Joi.string().required(),
        accounts: Joi.object().pattern(/./, Joi.array()).min(1).required()
    })
};