Joi数组验证,基于另一个字段值强制至少一个项

Joi数组验证,基于另一个字段值强制至少一个项,joi,Joi,我有下面的验证块 // POST /api/resources createResource: { body: { .... require at least 1 item permissions: Joi.array().items(Joi.object().keys({ level: Joi.string(), level_id: Joi.string().hex(), canWrite: Joi.bo

我有下面的验证块

  // POST /api/resources
  createResource: {
    body: {
      .... require at least 1 item 
      permissions: Joi.array().items(Joi.object().keys({
        level: Joi.string(),
        level_id: Joi.string().hex(),
        canWrite: Joi.boolean()
      })),
      private: Joi.boolean().required()
    }
  },
当private标志为false时,我希望在权限中至少需要1项 基于前面的一个问题(使用includes()而不是items()),我应该使用如下内容:

 permissions: Joi.array().items(Joi.object().keys({
        level: Joi.string(),
        level_id: Joi.string().hex(),
        canWrite: Joi.boolean()
      })).when('private'{is:false,then:Joi.required()})
但这不起作用 要验证它吗?
感谢您的反馈

您的验证格式有点奇怪,因此我假设您希望验证整个请求对象。e、 g

{
    createResource: {
        body: {
            permissions: [{...}, {...}],
            private: false
        }
    }
}
但如果我想错了,你仍然可以找出工作点

我不建议将POJO与
Joi
对象混合使用。您的示例的问题是
Joi
不知道
权限
私有
密钥与同一对象相关。要解决这个问题,您需要像这样为整个请求对象编写一个模式

Joi.object().keys({
    createResource: Joi.object().keys({
        body: Joi.object().keys({
            permissions: Joi.array().items(
                Joi.object().keys({
                    level: Joi.string(),
                    level_id: Joi.string().hex(),
                    canWrite: Joi.boolean()
                })).when('private', {is: false, then: Joi.required()}),
            private: Joi.boolean().required()
        })
    })
});

因此,当
private
true
时,这将验证
true
(不需要权限)

private
false
且没有权限时,
false

…和
true
private
false
权限
正确填充时


非常感谢!我必须更深入地了解Toi。。。似乎是一个强大的工具我在图片中使用的工具链接在我的答案底部。可以找到源代码。