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

Joi Array validation , force at least one item based on another field value

我有以下验证块

  // 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()
    }
  },

当私有标志为 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()})

但这不起作用 无论如何要验证它? 感谢反馈

您的验证格式有点奇怪,所以我假设您要验证整个请求对象。例如

{
    createResource: {
        body: {
            permissions: [{...}, {...}],
            private: false
        }
    }
}

但如果我假设错了,你仍然可以找出工作位..

我不建议将 POJO 与 Joi 对象混合使用。您的示例的问题是 Joi 不知道 permissionsprivate 键与同一对象相关。要解决此问题,您需要像这样为 entire 请求对象编写一个架构。

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()
        })
    })
});

所以这将在 privatetrue 时验证 true(不需要权限)

...falseprivatefalse 并且没有权限时

..and true when private is false and permissions is populated correctly.

Joi Tester