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

时间:2019-06-24 02:05:05

标签: joi

我正在尝试创建一个将接受此验证的架构:

A:

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

或这个 B:

{
 "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需要单个子数组而不指定键?

1 个答案:

答案 0 :(得分:0)

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

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